/*
 *
 *    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

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

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

        return CHIP_NO_ERROR;
    }
};

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

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

    ~TestAccessControlCluster() {}

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

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

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

        Wait();

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

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

    CHIP_ERROR TestWriteEntries_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntriesEmptyLists_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidPrivilege_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidAuthMode_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidSubject_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidTarget_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManySubjects_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManyTargets_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTooManyEntries_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreAcl_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaSubjectsPerAccessControlEntry_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaTargetsPerAccessControlEntry_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaAccessControlEntriesPerFabric_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_ACL_1_1() {}

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

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

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

        Wait();

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

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

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

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

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

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

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

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

    CHIP_ERROR TestThReadsClusterRevisionAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureMapAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeExtensionInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_ACL_2_1() {}

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

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

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

        Wait();

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

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

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

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

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

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

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

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

    CHIP_ERROR TestThReadsSubjectsPerAccessControlEntryAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTargetsPerAccessControlEntryAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAccessControlEntriesPerFabricAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_ACL_2_2() {}

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

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

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

        Wait();

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

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

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

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

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

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

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

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

    CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEndpoint0_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEveryEndpointExcept0_2()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_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
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_BOOL_2_1() {}

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

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

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

        Wait();

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

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

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

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

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

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

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

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

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

class Test_TC_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
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_BIND_1_1() {}

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

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

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

        Wait();

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

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

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

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

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

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

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

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

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_CC_1_1() {}

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

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

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

        Wait();

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

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_CC_2_1() {}

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

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

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

        Wait();

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

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            VerifyOrReturn(CheckConstraintType("driftCompensation", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("driftCompensation", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("driftCompensation", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            VerifyOrReturn(CheckConstraintType("compensationText", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("compensationText", value, 254));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("options", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("options", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull FeatureMapValue;

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

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Saving for comparision in step 19 reads FeatureMap attribute from DUT Error: %@", err);

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

            {
                FeatureMapValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorCapabilities", actualValue, FeatureMapValue));
            }

            VerifyOrReturn(CheckConstraintType("colorCapabilities", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorCapabilities", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorCapabilities", [value unsignedShortValue], 31U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            if (value != nil) {

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("numberOfPrimaries", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("numberOfPrimaries", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("numberOfPrimaries", [value unsignedCharValue], 6U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThReadsPrimary1XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_25()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary1YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_26()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary1IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs1OrMore_27()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_28()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_29()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs2OrMore_30()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_31()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_32()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs3OrMore_33()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4XAttributeFromDutVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_34()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_35()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs4OrMore_36()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_37()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_38()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs5OrMore_39()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_40()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_41()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs6OrMore_42()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointRIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointRIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointRIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointGIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointGIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointGIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointBIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointBIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointBIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_CC_3_2() {}

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

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

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

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 2s\n");
            err = TestWait2s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue60Direction0x00ShortestDistanceAndTransitionTime0Immediately_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 100ms\n");
            err = TestWait100ms_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x03DownAndRate5UnitsS_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 10s\n");
            err = TestWait10s_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Wait 2s\n");
            err = TestWait2s_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

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

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

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

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

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

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

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

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 215U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 38U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 52U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) Error: %@", err);

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 110U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 110U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:60U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

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

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

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

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

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:3U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s) Error: %@", err);

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 183U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 247U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) Error: %@", err);

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 140U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 190U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 140U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 190U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_CC_3_3() {}

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

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

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

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 "
                "(20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepHueCommandToDutWithStepMode0x01UpStepSize60AndTransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue50Direction0x00ShortestDistanceAndTransitionTime0Immediately_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 100ms\n");
            err = TestWait100ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepHueCommandToDutWithStepMode0x03DownStepSize60AndTransitionTime20020s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10s\n");
            err = TestWait10s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 5s\n");
            err = TestWait5s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_24();
            break;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

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

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

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

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

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

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

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

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

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

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

        __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 "
                                  @"(20s) Error: %@",
                                err);

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:50U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

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

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

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

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

        __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and TransitionTime=200 "
                                  @"(20s) Error: %@",
                                err);

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

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 17U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 208U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 208U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

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

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

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

    ~Test_TC_CC_4_1() {}

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

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

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

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation60AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 (30s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime30030s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17();
            break;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

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

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

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

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

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

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

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

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

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

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation60AndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime30030s_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 "
                                           @"(30s) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 115U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 102U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 138U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 102U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 138U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_2()
        : TestCommandBridge("Test_TC_CC_4_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 100ms\n");
            err = TestWait100ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x03DownAndRate5UnitsS_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10s\n");
            err = TestWait10s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 10s\n");
            err = TestWait10s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 100ms\n");
            err = TestWait100ms_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait 10s\n");
            err = TestWait10s_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 26 : TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x00StopAndRate5UnitsS_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Wait 2s\n");
            err = TestWait2s_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_33();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 34;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveSaturationWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(
                                  @"TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x03DownAndRate5UnitsS_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:3U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s) "
                                         @"Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 59U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 81U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 17U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 10U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_22()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveSaturationWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(
                                  @"TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_24()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x00StopAndRate5UnitsS_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) "
                                         @"Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_28()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_3()
        : TestCommandBridge("Test_TC_CC_4_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation200AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize40AndTransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and "
                "TransitionTime=100 (10s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10s\n");
            err = TestWait10s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 100ms\n");
            err = TestWait100ms_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize40AndTransitionTime20020s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 5s\n");
            err = TestWait5s_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and "
                "TransitionTime=100 (10 s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Wait 10s\n");
            err = TestWait10s_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation200AndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:200U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize40AndTransitionTime20020s_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:40U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and "
                                         @"TransitionTime=200 (20s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 187U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 253U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 204U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 204U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:20U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:100U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and "
                                         @"TransitionTime=100 (10s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_16()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize40AndTransitionTime20020s_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:40U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and "
                                         @"TransitionTime=200 (20s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_18()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 25U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 35U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_20()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_22()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:20U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:100U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and "
                                         @"TransitionTime=100 (10 s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_25()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentSaturation", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_4()
        : TestCommandBridge("Test_TC_CC_4_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueAndSaturationCommandToDutWithHue200Saturation50AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentHue attribute from DUT.\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue200Saturation50AndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueAndSaturationWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and "
                                                 @"TransitionTime=0 (immediately) Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:160U];
        params.saturation = [NSNumber numberWithUnsignedChar:80U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueAndSaturationWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and "
                                                 @"TransitionTime=200 (20s) Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 160U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 50U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 135U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 185U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentSaturation", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 135U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 185U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_1()
        : TestCommandBridge("Test_TC_CC_5_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 200 (20s)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH read Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadOptionsAttribute_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH sends a MoveToColor command to the DUT with ColorX = 32768/0x8000 (x=0.5) (purple) "
                "ColorY = 19660/0x4CCC (y=0.3) TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Wait 100ms\n");
            err = TestWait100ms_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 25 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Wait 100ms\n");
            err = TestWait100ms_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool,
                " ***** Test Step 29 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Wait 100ms\n");
            err = TestWait100ms_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Wait 100ms\n");
            err = TestWait100ms_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH read Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadOptionsAttribute_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_39();
            break;
        case 40:
            ChipLogProgress(chipTool,
                " ***** Test Step 40 : TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Wait 100ms\n");
            err = TestWait100ms_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_44();
            break;
        case 45:
            ChipLogProgress(chipTool,
                " ***** Test Step 45 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Wait 100ms\n");
            err = TestWait100ms_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_48();
            break;
        case 49:
            ChipLogProgress(chipTool,
                " ***** Test Step 49 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Wait 100ms\n");
            err = TestWait100ms_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_52();
            break;
        case 53:
            ChipLogProgress(chipTool,
                " ***** Test Step 53 : TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Wait 100ms\n");
            err = TestWait100ms_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_58();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 59;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 200 (20s) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 13107U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 32768U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 13107U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 19660U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadOptionsAttribute_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToColor command to the DUT with ColorX = 32768/0x8000 (x=0.5) (purple) "
                                      @"ColorY = 19660/0x4CCC (y=0.3) TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_21()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_26()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 19660U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_30()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 19660U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:26214U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_34()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 22282U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30146U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1ToTheOptionsAttribute_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 1 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadOptionsAttribute_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_41()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_46()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_50()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 13107U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 13107U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:26214U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_54()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 22282U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30146U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_2()
        : TestCommandBridge("Test_TC_CC_5_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 "
                "(immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX33000ColorY26000TransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends MoveColor command to DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 10s\n");
            err = TestWait10s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends StopMoveStep command to DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStopMoveStepCommandToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY26000TransitionTime0Immediate_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:33000U];
        params.colorY = [NSNumber numberWithUnsignedShort:26000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 "
                                      @"(immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveColorCommandToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveColorParams alloc] init];
        params.rateX = [NSNumber numberWithShort:-100];
        params.rateY = [NSNumber numberWithShort:100];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveColorWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveColor command to DUT Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 36800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 22900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 31100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 26350U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 35650U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 23800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 32200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }
    NSNumber * _Nonnull CurrentXValue;

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 25500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 34500U));
            {
                CurrentXValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull CurrentYValue;

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 24650U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 33350U));
            {
                CurrentYValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStopMoveStepCommandToDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStopMoveStepParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopMoveStepWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"TH sends StopMoveStep command to DUT Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 25500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 34500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 24650U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 33350U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_3()
        : TestCommandBridge("Test_TC_CC_5_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 "
                "(immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX33000ColorY20000TransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 "
                "(20s)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepColorCommandToDutWithStepX20000StepY6000TransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_18();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 19;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY20000TransitionTime0Immediate_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:33000U];
        params.colorY = [NSNumber numberWithUnsignedShort:20000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 "
                                      @"(immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepColorCommandToDutWithStepX20000StepY6000TransitionTime20020s_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepColorParams alloc] init];
        params.stepX = [NSNumber numberWithShort:-20000];
        params.stepY = [NSNumber numberWithShort:-6000];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepColorWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 "
                                    @"(20s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 13000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 33000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 14000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 20000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11050U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 14950U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 16100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11050U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 14950U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 16100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_6_1()
        : TestCommandBridge("Test_TC_CC_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_6_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads ColorTempPhysicalMinMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads ColorTempPhysicalMaxMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 and "
                "TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 100ms\n");
            err = TestWait100ms_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 and "
                "TransitionTime=300 (30s).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperaturCommandToDutWithColorTemperatureMireds250AndTransitionTime30030s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10s\n");
            err = TestWait10s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 5s\n");
            err = TestWait5s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMinMiredsValue;

    CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMinMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMinMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 65279U));
            {
                ColorTempPhysicalMinMiredsValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMaxMiredsValue;

    CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMaxMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMaxMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 65279U));
            {
                ColorTempPhysicalMaxMiredsValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTemperatureMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>(
                "colorTemperatureMireds", [value unsignedShortValue], ColorTempPhysicalMinMiredsValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>(
                "colorTemperatureMireds", [value unsignedShortValue], ColorTempPhysicalMaxMiredsValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
        params.colorTemperature = [NSNumber numberWithUnsignedShort:310U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorTemperatureWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 "
                                                 @"and TransitionTime=0 (immediately). Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveToColorTemperaturCommandToDutWithColorTemperatureMireds250AndTransitionTime30030s_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
        params.colorTemperature = [NSNumber numberWithUnsignedShort:250U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorTemperatureWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 "
                                                 @"and TransitionTime=300 (30s). Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 246U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 334U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 230U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 310U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 212U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 288U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 212U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 288U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_7_3()
        : TestCommandBridge("Test_TC_CC_7_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_7_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_7_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_7_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest "
                "distance) and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue6000Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and "
                "TransitionTime=300 (30s).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedStepHueCommandToDutWithStepMode0x01UpStepSize6000AndTransitionTime30030s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest "
                "distance) and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 100ms\n");
            err = TestWait100ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and "
                "TransitionTime=300 (30s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedStepHueCommandToDutWithStepMode0x03DownStepSize6000AndTransitionTime30030s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 10s\n");
            err = TestWait10s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Wait 10s\n");
            err = TestWait10s_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Wait 5s\n");
            err = TestWait5s_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_28();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 29;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue6000Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:6000U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 "
                                            @"(shortest distance) and TransitionTime=0 (immediately). Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x01UpStepSize6000AndTransitionTime30030s_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedShort:6000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedStepHueWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and "
                                          @"TransitionTime=300 (30s). Error: %@",
                                        err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 8500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 10200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 10200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:12000U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 "
                                            @"(shortest distance) and TransitionTime=0 (immediately). Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x03DownStepSize6000AndTransitionTime30030s_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedShort:6000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedStepHueWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and "
                                          @"TransitionTime=300 (30s) Error: %@",
                                        err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 8500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_21()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 5100U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6900U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_23()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 5100U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6900U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_7_4()
        : TestCommandBridge("Test_TC_CC_7_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_7_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_7_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_7_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, Saturation=50 "
                "and TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue20000Saturation50AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=16000, Saturation=80 "
                "and TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue20000Saturation50AndTransitionTime0Immediately_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:20000U];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            enhancedMoveToHueAndSaturationWithParams:params
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(
                                                  @"TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, "
                                                  @"Saturation=50 and TransitionTime=0 (immediately) Error: %@",
                                                  err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 17000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 23000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:16000U];
        params.saturation = [NSNumber numberWithUnsignedChar:80U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueAndSaturationWithParams:params
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"TH sends EnhancedMoveToHueAndSaturation command to DUT with "
                                                         @"EnhancedHue=16000, Saturation=80 and TransitionTime=200 (20s) Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedCurrentHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 16000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 20000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 50U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedCurrentHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13600U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 18400U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedCurrentHue", actualValue, 16000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentSaturation", actualValue, 80U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OPCREDS_1_2()
        : TestCommandBridge("Test_TC_OPCREDS_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OPCREDS_1_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OPCREDS_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OPCREDS_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BINFO_1_1()
        : TestCommandBridge("Test_TC_BINFO_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BINFO_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BINFO_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BINFO_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads optional attribute(ManufacturingDate) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeManufacturingDateInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads optional attribute(PartNumber) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePartNumberInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(ProductURL) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductURLInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(ProductLabel) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductLabelInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads optional attribute(SerialNumber) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSerialNumberInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute(LocalConfigDisabled) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLocalConfigDisabledInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads optional attribute(Reachable) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeReachableInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads optional attribute(UniqueID) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeUniqueIDInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH1 reads AcceptedCommandList from DUT\n");
            err = TestTh1ReadsAcceptedCommandListFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH1 reads GeneratedCommandList from DUT\n");
            err = TestTh1ReadsGeneratedCommandListFromDut_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeManufacturingDateInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ManufacturingDate) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePartNumberInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PartNumber) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductURLInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductURL) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductLabelInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductLabel) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSerialNumberInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SerialNumber) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLocalConfigDisabledInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LocalConfigDisabled) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeReachableInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Reachable) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeUniqueIDInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(UniqueID) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsAcceptedCommandListFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsGeneratedCommandListFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_1_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CNET_1_3()
        : TestCommandBridge("Test_TC_CNET_1_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CNET_1_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CNET_1_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CNET_1_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        }

        if (CHIP_NO_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
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DLOG_1_1()
        : TestCommandBridge("Test_TC_DLOG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DLOG_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DLOG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DLOG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
                                                                                           endpointID:@(0)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
                                                                                           endpointID:@(0)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
                                                                                           endpointID:@(0)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
                                                                                           endpointID:@(0)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
                                                                                           endpointID:@(0)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1UL));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_1_1()
        : TestCommandBridge("Test_TC_DGETH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given DGETH.S.F00 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGETH.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDgethsf00EnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given DGETH.S.F01 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDgethsf01EnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(PHYRate) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePHYRateInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(FullDuplex) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeFullDuplexInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads optional attribute(CarrierDetect) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCarrierDetectInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads optional attribute(TimeSinceReset) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTimeSinceResetInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGETH.S.F00 || DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgethsf00EnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGETH.S.F00 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgethsf01EnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGETH.S.F01 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePHYRateInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PHYRate) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeFullDuplexInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(FullDuplex) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCarrierDetectInAttributeList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CarrierDetect) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTimeSinceResetInAttributeList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(TimeSinceReset) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_2_1()
        : TestCommandBridge("Test_TC_DGETH_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read PHYRate attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadPHYRateAttributeConstraints_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FullDuplex attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadFullDuplexAttributeConstraints_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read PacketRxCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadPacketRxCountAttributeConstraints_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : Read PacketRxCount value from DUT and verify the number of packets received on ethernet "
                "network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadPacketRxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read PacketTxCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadPacketTxCountAttributeConstraints_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Read PacketTxCount value from DUT and verify the number of packets received on ethernet "
                "network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadPacketTxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read TxErrCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTxErrCountAttributeConstraints_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : Read TxErrCount value from DUT and verify value indicates the number of failed packet "
                "transmission on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTxErrCountValueFromDutAndVerifyValueIndicatesTheNumberOfFailedPacketTransmissionOnEthernetNetworkInterface_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read CollisionCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadCollisionCountAttributeConstraints_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read CollisionCount value from DUT and verify value indicates the number of collision "
                "occurred while transmitting packets on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadCollisionCountValueFromDutAndVerifyValueIndicatesTheNumberOfCollisionOccurredWhileTransmittingPacketsOnEthernetNetworkInterface_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read OverrunCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOverrunCountAttributeConstraints_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Read OverrunCount value from DUT and verify value indicates the number of packets dropped "
                "due to lack of buffer memory on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOverrunCountValueFromDutAndVerifyValueIndicatesTheNumberOfPacketsDroppedDueToLackOfBufferMemoryOnEthernetNetworkInterface_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read CarrierDetect attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadCarrierDetectAttributeConstraints_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : Read CarrierDetect value from DUT and verify value indicates the presence of carrier detect "
                "control signal on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadCarrierDetectValueFromDutAndVerifyValueIndicatesThePresenceOfCarrierDetectControlSignalOnEthernetNetworkInterface_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read TimeSinceReset attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTimeSinceResetAttributeConstraints_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : Read TimeSinceReset value from DUT and verify the value indicates the duration of time, in "
                "minutes\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTimeSinceResetValueFromDutAndVerifyTheValueIndicatesTheDurationOfTimeInMinutes_16();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 17;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadPHYRateAttributeConstraints_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PHYRate attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFullDuplexAttributeConstraints_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFullDuplexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FullDuplex attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("fullDuplex", "boolean", "boolean"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketRxCountAttributeConstraints_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PacketRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("packetRxCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketRxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadPacketTxCountAttributeConstraints_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PacketTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("packetTxCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketTxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_6()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadTxErrCountAttributeConstraints_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TxErrCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("txErrCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadTxErrCountValueFromDutAndVerifyValueIndicatesTheNumberOfFailedPacketTransmissionOnEthernetNetworkInterface_8()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadCollisionCountAttributeConstraints_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CollisionCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("collisionCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadCollisionCountValueFromDutAndVerifyValueIndicatesTheNumberOfCollisionOccurredWhileTransmittingPacketsOnEthernetNetworkInterface_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadOverrunCountAttributeConstraints_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OverrunCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("overrunCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadOverrunCountValueFromDutAndVerifyValueIndicatesTheNumberOfPacketsDroppedDueToLackOfBufferMemoryOnEthernetNetworkInterface_12()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadCarrierDetectAttributeConstraints_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCarrierDetectWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CarrierDetect attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("carrierDetect", "boolean", "boolean"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadCarrierDetectValueFromDutAndVerifyValueIndicatesThePresenceOfCarrierDetectControlSignalOnEthernetNetworkInterface_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadTimeSinceResetAttributeConstraints_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTimeSinceResetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TimeSinceReset attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("timeSinceReset", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTimeSinceResetValueFromDutAndVerifyTheValueIndicatesTheDurationOfTimeInMinutes_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_DGETH_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_2_2()
        : TestCommandBridge("Test_TC_DGETH_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads PacketRxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketRxCountAttributeValueFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads PacketTxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketTxCountAttributeValueFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads TxErrCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTxErrCountAttributeValueFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CollisionCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsCollisionCountAttributeValueFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads OverrunCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOverrunCountAttributeValueFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Sends ResetCounts command\n");
            if (ShouldSkip("DGETH.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsResetCountsCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads PacketRxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketRxCountAttributeValueFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads PacketTxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketTxCountAttributeValueFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads TxErrCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTxErrCountAttributeValueFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CollisionCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsCollisionCountAttributeValueFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads OverrunCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOverrunCountAttributeValueFromDut_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull PacketRxCount;

    CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketRxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                PacketRxCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull PacketTxCount;

    CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketTxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                PacketTxCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull TxErrCount;

    CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TxErrCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                TxErrCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull CollisionCount;

    CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CollisionCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                CollisionCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull OverrunCount;

    CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OverrunCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                OverrunCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsResetCountsCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Sends ResetCounts command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketRxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("packetRxCount", [value unsignedLongLongValue], PacketRxCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketTxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("packetTxCount", [value unsignedLongLongValue], PacketTxCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TxErrCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("txErrCount", [value unsignedLongLongValue], TxErrCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CollisionCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("collisionCount", [value unsignedLongLongValue], CollisionCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OverrunCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("overrunCount", [value unsignedLongLongValue], OverrunCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLW_1_1()
        : TestCommandBridge("Test_TC_FLW_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLW_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLW_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLW_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("FLW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLW_2_1()
        : TestCommandBridge("Test_TC_FLW_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLW_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLW_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLW_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MinMeasuredValue\n");
            if (ShouldSkip("FLW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMinMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxMeasuredValue\n");
            if (ShouldSkip("FLW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MeasuredValue\n");
            if (ShouldSkip("FLW.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads from the DUT the Tolerance attribute\n");
            if (ShouldSkip("FLW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheToleranceAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 65533U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheToleranceAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the Tolerance attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLABEL_1_1()
        : TestCommandBridge("Test_TC_FLABEL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLABEL_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLABEL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLABEL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CGEN_1_1()
        : TestCommandBridge("Test_TC_CGEN_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CGEN_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CGEN_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CGEN_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CGEN_2_1()
        : TestCommandBridge("Test_TC_CGEN_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CGEN_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CGEN_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CGEN_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH1 reads the BreadCrumb Attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheBreadCrumbAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH1 writes the BreadCrumb attribute as 1 to the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1WritesTheBreadCrumbAttributeAs1ToTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH1 reads the BreadCrumb attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheBreadCrumbAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH1 reads the RegulatoryConfig attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheRegulatoryConfigAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH1 reads the LocationCapability attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheLocationCapabilityAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH1 reads BasicCommissioningInfo attribute from DUT and Verify that the "
                "BasicCommissioningInfo attribute has the following field: FailSafeExpiryLengthSeconds field value is within a "
                "duration range of 0 to 65535\n");
            if (ShouldSkip("CGEN.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsBasicCommissioningInfoAttributeFromDutAndVerifyThatTheBasicCommissioningInfoAttributeHasTheFollowingFieldFailSafeExpiryLengthSecondsFieldValueIsWithinADurationRangeOf0To65535_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH1 reads SupportsConcurrentConnection attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsSupportsConcurrentConnectionAttributeFromTheDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the BreadCrumb Attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("breadcrumb", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1WritesTheBreadCrumbAttributeAs1ToTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"TH1 writes the BreadCrumb attribute as 1 to the DUT Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the BreadCrumb attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheRegulatoryConfigAttributeFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRegulatoryConfigWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the RegulatoryConfig attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("regulatoryConfig", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("regulatoryConfig", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheLocationCapabilityAttributeFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationCapabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the LocationCapability attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("locationCapability", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("locationCapability", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1ReadsBasicCommissioningInfoAttributeFromDutAndVerifyThatTheBasicCommissioningInfoAttributeHasTheFollowingFieldFailSafeExpiryLengthSecondsFieldValueIsWithinADurationRangeOf0To65535_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBasicCommissioningInfoWithCompletion:^(
            MTRGeneralCommissioningClusterBasicCommissioningInfo * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH1 reads BasicCommissioningInfo attribute from DUT and Verify that the BasicCommissioningInfo attribute has the "
                @"following field: FailSafeExpiryLengthSeconds field value is within a duration range of 0 to 65535 Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsSupportsConcurrentConnectionAttributeFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads SupportsConcurrentConnection attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportsConcurrentConnection", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGGEN_1_1()
        : TestCommandBridge("Test_TC_DGGEN_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGGEN_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGGEN_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGGEN_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read optional attribute(UpTime) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeUpTimeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read optional attribute(TotalOperationalHours) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeTotalOperationalHoursInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read optional attribute(BootReason) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeBootReasonInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read optional attribute(ActiveHardwareFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveHardwareFaultsInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read optional attribute(ActiveRadioFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveRadioFaultsInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read optional attribute(ActiveNetworkFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveNetworkFaultsInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeUpTimeInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(UpTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeTotalOperationalHoursInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(TotalOperationalHours) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeBootReasonInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(BootReason) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveHardwareFaultsInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveHardwareFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveRadioFaultsInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveRadioFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveNetworkFaultsInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveNetworkFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGGEN_2_1()
        : TestCommandBridge("Test_TC_DGGEN_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGGEN_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGGEN_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGGEN_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads NetworkInterfaces structure attribute from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsNetworkInterfacesStructureAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads a RebootCount attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsARebootCountAttributeValueFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of "
                "DUT rebooting.\n");
            if (ShouldSkip("DGGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestDutRebootsAndThReadsAUpTimeAttributeValueOfDutSinceSomeArbitraryStartTimeOfDutRebooting_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads a TotalOperationalHours attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsATotalOperationalHoursAttributeValueFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads BootReason attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsBootReasonAttributeValueFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ActiveHardwareFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveHardwareFaultsAttributeValueFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ActiveRadioFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveRadioFaultsAttributeValueFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ActiveNetworkFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveNetworkFaultsAttributeValueFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads TestEventTriggersEnabled attribute value\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsTestEventTriggersEnabledAttributeValue_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsNetworkInterfacesStructureAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNetworkInterfacesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NetworkInterfaces structure attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("networkInterfaces", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsARebootCountAttributeValueFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRebootCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads a RebootCount attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("rebootCount", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("rebootCount", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("rebootCount", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_3()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDevice_5()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_6()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestDutRebootsAndThReadsAUpTimeAttributeValueOfDutSinceSomeArbitraryStartTimeOfDutRebooting_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUpTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of DUT rebooting. "
                  @"Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("upTime", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsATotalOperationalHoursAttributeValueFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTotalOperationalHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads a TotalOperationalHours attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("totalOperationalHours", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("totalOperationalHours", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("totalOperationalHours", [value unsignedIntValue], 4294967294UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_10()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_11()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsBootReasonAttributeValueFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBootReasonsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads BootReason attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("bootReasons", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("bootReasons", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsActiveHardwareFaultsAttributeValueFromDut_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsActiveRadioFaultsAttributeValueFromDut_15()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsActiveNetworkFaultsAttributeValueFromDut_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTestEventTriggersEnabledAttributeValue_17()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_I_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_1_1()
        : TestCommandBridge("Test_TC_I_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional command(TriggerEffect) in AcceptedCommandList\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(TriggerEffect) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 64UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_1()
        : TestCommandBridge("Test_TC_I_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the IdentifyTime attribute from the DUT\n");
            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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the IdentifyTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("identifyTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheIdentifyTypeAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the IdentifyType attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("identifyType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("identifyType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("identifyType", [value unsignedCharValue], 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_2()
        : TestCommandBridge("Test_TC_I_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH sends Identify command to DUT, with the 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 writes a value of 0x000f (15s) to IdentifyTime attribute of DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 5000ms\n");
            err = TestWait5000ms_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : After 5 seconds, the TH reads IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x003c60s_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:60U];
        [cluster identifyWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Identify command to DUT, with the 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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads immediately IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 51U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 69U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_3()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfter10SecondsTheThReadsIdentifyTimeAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After 10 seconds, the TH reads IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsIdentifyQueryCommandToDutAndVerifyIdentifyQueryResponseCommandToTHwithTheTimeoutFieldSetToAValueInTheRange0x0000To0x0032_5()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x0000StopIdentifying_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster identifyWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Identify command to DUT, with the 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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads immediately IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("identify time", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id identifyTimeArgument;
        identifyTimeArgument = [NSNumber numberWithUnsignedShort:15U];
        [cluster writeAttributeIdentifyTimeWithValue:identifyTimeArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT Error: %@",
                                                  err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After 5 seconds, the TH reads IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 15U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_3()
        : TestCommandBridge("Test_TC_I_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 1.Wait for the commissioned device to be retrieved\n");
            err = Test1WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink and "
                "the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x00Default_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : DUT executes a blink effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABlinkEffect_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe "
                "and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x02 okay and "
                "the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x02OkayAndTheEffectVariantFieldSetTo0x00Default_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : DUT executes an okay effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesAnOkayEffect_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x0b channel "
                "change and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x0bChannelChangeAndTheEffectVariantFieldSetTo0x00Default_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : DUT executes a channel change effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesAChannelChangeEffect_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe "
                "and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0xfe finish "
                "effect and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xfeFinishEffectAndTheEffectVariantFieldSetTo0x00Default_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : DUT stops the breathe effect after the current effect sequence\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsTheBreatheEffectAfterTheCurrentEffectSequence_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe "
                "and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop "
                "effect and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : DUT stops the breathe effect as soon as possible.\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsTheBreatheEffectAsSoonAsPossible_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink "
                "and the effect variant field set to 0x42 unknown\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x42Unknown_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check DUT executes a blink effect.\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestCheckDutExecutesABlinkEffect_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop "
                "effect and the effect variant field set to 0x00 default\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : DUT stops any effect that may be still running as soon as possible\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsAnyEffectThatMayBeStillRunningAsSoonAsPossible_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test1WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x00Default_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:0U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink "
                                        @"and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABlinkEffect_2()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x02OkayAndTheEffectVariantFieldSetTo0x00Default_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:2U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x02 okay "
                                        @"and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesAnOkayEffect_6()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x0bChannelChangeAndTheEffectVariantFieldSetTo0x00Default_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:11U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x0b "
                                        @"channel change and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesAChannelChangeEffect_8()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xfeFinishEffectAndTheEffectVariantFieldSetTo0x00Default_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:254U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0xfe "
                                        @"finish effect and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsTheBreatheEffectAfterTheCurrentEffectSequence_12()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:255U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop "
                                        @"effect and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsTheBreatheEffectAsSoonAsPossible_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x42Unknown_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:0U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:66U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink "
                                        @"and the effect variant field set to 0x42 unknown Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckDutExecutesABlinkEffect_18()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:255U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop "
                                        @"effect and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsAnyEffectThatMayBeStillRunningAsSoonAsPossible_20()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_ILL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_1_1()
        : TestCommandBridge("Test_TC_ILL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("ILL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(LightSensorType) in AttributeList\n");
            if (ShouldSkip("ILL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLightSensorTypeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLightSensorTypeInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(LightSensorType) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_2_1()
        : TestCommandBridge("Test_TC_ILL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads MinMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsMinMeasuredValueAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads MaxMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsMaxMeasuredValueAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads MeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsMeasuredValueAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads Tolerance attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsToleranceAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads LightSensorType attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsLightSensorTypeAttributeFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MinMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 65533U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MaxMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 2U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMeasuredValueAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsToleranceAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Tolerance attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLightSensorTypeAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLightSensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LightSensorType attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lightSensorType", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("lightSensorType", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("lightSensorType", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_2_2()
        : TestCommandBridge("Test_TC_ILL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads MinMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsMinMeasuredValueAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads MaxMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsMaxMeasuredValueAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Cover the sensor or darken the room\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestCoverTheSensorOrDarkenTheRoom_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 1s\n");
            err = TestWait1s_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : After a few seconds, TH reads MeasuredValue attribute from DUT.\n");
            if (ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Expose the sensor again to light\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestExposeTheSensorAgainToLight_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 1s\n");
            err = TestWait1s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : After a few seconds, TH reads MeasuredValue attribute from DUT.\n");
            if (ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable MinMeasuredValue;

    CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MinMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
            }
            {
                MinMeasuredValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable MaxMeasuredValue;

    CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MaxMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
            }
            {
                MaxMeasuredValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCoverTheSensorOrDarkenTheRoom_3()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWait1s_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads MeasuredValue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestExposeTheSensorAgainToLight_6()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWait1s_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads MeasuredValue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_1_1()
        : TestCommandBridge("Test_TC_LVL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !LVL.S.F00 && !LVL.S.F01 && !LVL.S.F02 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given LVL.S.F00(OO) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf00ooEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given LVL.S.F01(LT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf01ltEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given LVL.S.F02(FQ) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf02fqEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in "
                "AttributeList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(MinLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinLevelInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(MaxLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxLevelInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute(OnOffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOnOffTransitionTimeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute(OnTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOnTransitionTimeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute(OffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOffTransitionTimeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute(DefaultMoveRate) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDefaultMoveRateInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentLVLSF02CommandInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf00ooEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F00(OO) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf01ltEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F01(LT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf02fqEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F02(FQ) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16384UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinLevelInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MinLevel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxLevelInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MaxLevel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOnOffTransitionTimeInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OnOffTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOnTransitionTimeInAttributeList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OnTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOffTransitionTimeInAttributeList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OffTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDefaultMoveRateInAttributeList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(DefaultMoveRate) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentLVLSF02CommandInAcceptedCommandList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_2_1()
        : TestCommandBridge("Test_TC_LVL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentLevelAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the RemainingTime attribute\n");
            if (ShouldSkip("LVL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheRemainingTimeAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the MinLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinLevelAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the MinLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinLevelAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the MaxLevel attribute\n");
            if (ShouldSkip("LVL.S.A0003 && LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxLevelAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the MaxLevel attribute\n");
            if (ShouldSkip("LVL.S.A0003 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxLevelAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 4b & 4C Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.F01 && LVL.S.A0002 && LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestStep4b4cReadsTheCurrentLevelAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Step 4b & 4C Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && LVL.S.A0003 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestStep4b4cReadsTheCurrentLevelAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads the CurrentFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentFrequencyAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the MinFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinFrequencyAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads the MaxFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxFrequencyAttribute_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Step 7b & 7C Reads the CurrentFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0004 && LVL.S.A0005 && LVL.S.A0006")) {
                NextTest();
                return;
            }
            err = TestStep7b7cReadsTheCurrentFrequencyAttribute_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttribute_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the OnLevel attribute \n");
            if (ShouldSkip("LVL.S.F01 && LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads the OnLevel attribute \n");
            if (ShouldSkip("LVL.S.A0011 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttribute_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads the OnTransitionTime attribute \n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttribute_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the OffTransitionTime attribute \n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reads the DefaultMoveRate attribute \n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttribute_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Reads the Options attribute \n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestReadsTheOptionsAttribute_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads the StartUpCurrentLevel attribute \n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttribute_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable CurrentLevelValue;

    CHIP_ERROR TestReadsTheCurrentLevelAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
            }
            {
                CurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheRemainingTimeAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the RemainingTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("remainingTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("remainingTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("remainingTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinLevelValue;

    CHIP_ERROR TestReadsTheMinLevelAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("minLevel", "int8u", "int8u"));
            {
                MinLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinLevelFeatureMapNotSupportedValue;

    CHIP_ERROR TestReadsTheMinLevelAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("minLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("minLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("minLevel", [value unsignedCharValue], 254U));
            {
                MinLevelFeatureMapNotSupportedValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxLevelValue;

    CHIP_ERROR TestReadsTheMaxLevelAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxLevel", actualValue, 254U));
            }

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], MinLevelValue));
            {
                MaxLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxLevelFeatureMapNotSupportedValue;

    CHIP_ERROR TestReadsTheMaxLevelAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("maxLevel", [value unsignedCharValue], 254U));
            {
                MaxLevelFeatureMapNotSupportedValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 4b & 4C Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], MaxLevelValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 4b & 4C Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>(
                    "currentLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>(
                    "currentLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentFrequencyAttribute_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentFrequency", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinFrequencyValue;

    CHIP_ERROR TestReadsTheMinFrequencyAttribute_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("minFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minFrequency", [value unsignedShortValue], 65535U));
            {
                MinFrequencyValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxFrequencyValue;

    CHIP_ERROR TestReadsTheMaxFrequencyAttribute_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxFrequency", [value unsignedShortValue], 65535U));
            {
                MaxFrequencyValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep7b7cReadsTheCurrentFrequencyAttribute_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 7b & 7C Reads the CurrentFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentFrequency", [value unsignedShortValue], MinFrequencyValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentFrequency", [value unsignedShortValue], MaxFrequencyValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttribute_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttribute_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], MaxLevelValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttribute_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnTransitionTimeAttribute_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOffTransitionTimeAttribute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheDefaultMoveRateAttribute_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOptionsAttribute_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Options attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttribute_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the StartUpCurrentLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_2_2()
        : TestCommandBridge("Test_TC_LVL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("OnOffTransitionTimeConfigValue", 0, UINT16_MAX, &mOnOffTransitionTimeConfigValue);
        AddArgument("OnLevelConfigValue", 0, UINT8_MAX, &mOnLevelConfigValue);
        AddArgument("OnTransitionTimeConfigValue", 0, UINT16_MAX, &mOnTransitionTimeConfigValue);
        AddArgument("OffTransitionTimeConfigValue", 0, UINT16_MAX, &mOffTransitionTimeConfigValue);
        AddArgument("DefaultMoveRateConfigValue", 0, UINT8_MAX, &mDefaultMoveRateConfigValue);
        AddArgument("StartUpCurrentLevelConfigValue", 0, UINT8_MAX, &mStartUpCurrentLevelConfigValue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OnOffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : writes the OnOffTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnOffTransitionTimeAttributeOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the OnOffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the OnLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : writes the OnLevel attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnLevelAttributeOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the OnLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the OnTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Writes the OnTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnTransitionTimeAttributeOnTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads the OnTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttributeFromTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the OffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Writes the OffTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestWritesTheOffTransitionTimeAttributeOnTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the OffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the DefaultMoveRate attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttributeFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Writes the DefaultMoveRate attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestWritesTheDefaultMoveRateAttributeOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads the DefaultMoveRate attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttributeFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads the StartUpCurrentLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : writes the StartUpCurrentLevel attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestWritesTheStartUpCurrentLevelAttributeOnTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : reads the StartUpCurrentLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttributeFromTheDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : writes back default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestWritesBackDefaultValueOfOnOffTransitionTimeAttribute_19();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 20;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mOnOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mOnLevelConfigValue;
    chip::Optional<uint16_t> mOnTransitionTimeConfigValue;
    chip::Optional<uint16_t> mOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mDefaultMoveRateConfigValue;
    chip::Optional<uint8_t> mStartUpCurrentLevelConfigValue;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull OnOffTransitionTimeValue;

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 65535U));
            {
                OnOffTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnOffTransitionTimeAttributeOnTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = mOnOffTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOnOffTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:10U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"writes the OnOffTransitionTime attribute on the DUT Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue,
                    mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U));
            }

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintNotValue("onOffTransitionTime", value, OnOffTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnLevelValue;

    CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], 254U));
            }
            {
                OnLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnLevelAttributeOnTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = mOnLevelConfigValue.HasValue() ? [NSNumber numberWithUnsignedChar:mOnLevelConfigValue.Value()]
                                                         : [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"writes the OnLevel attribute on the DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
                VerifyOrReturn(
                    CheckValue("OnLevel", actualValue, mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("onLevel", value, OnLevelValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnTransitionTimeValue;

    CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 65535U));
            }
            {
                OnTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnTransitionTimeAttributeOnTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onTransitionTimeArgument;
        onTransitionTimeArgument = mOnTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOnTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:5U];
        [cluster writeAttributeOnTransitionTimeWithValue:onTransitionTimeArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the OnTransitionTime attribute on the DUT Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnTransitionTime", actualValue));
                VerifyOrReturn(CheckValue("OnTransitionTime", actualValue,
                    mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("onTransitionTime", value, OnTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OffTransitionTimeValue;

    CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 65535U));
            }
            {
                OffTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOffTransitionTimeAttributeOnTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id offTransitionTimeArgument;
        offTransitionTimeArgument = mOffTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOffTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:10U];
        [cluster writeAttributeOffTransitionTimeWithValue:offTransitionTimeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Writes the OffTransitionTime attribute on the DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OffTransitionTime", actualValue));
                VerifyOrReturn(CheckValue("OffTransitionTime", actualValue,
                    mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("offTransitionTime", value, OffTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable DefaultMoveRatevalue;

    CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 255U));
            }
            {
                DefaultMoveRatevalue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheDefaultMoveRateAttributeOnTheDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id defaultMoveRateArgument;
        defaultMoveRateArgument = mDefaultMoveRateConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedChar:mDefaultMoveRateConfigValue.Value()]
            : [NSNumber numberWithUnsignedChar:111U];
        [cluster writeAttributeDefaultMoveRateWithValue:defaultMoveRateArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Writes the DefaultMoveRate attribute on the DUT Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("DefaultMoveRate", actualValue));
                VerifyOrReturn(CheckValue("DefaultMoveRate", actualValue,
                    mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("defaultMoveRate", value, DefaultMoveRatevalue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable StartUpCurrentLevelValue;

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the StartUpCurrentLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 255U));
            }
            {
                StartUpCurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheStartUpCurrentLevelAttributeOnTheDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpCurrentLevelArgument;
        startUpCurrentLevelArgument = mStartUpCurrentLevelConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedChar:mStartUpCurrentLevelConfigValue.Value()]
            : [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeStartUpCurrentLevelWithValue:startUpCurrentLevelArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"writes the StartUpCurrentLevel attribute on the DUT Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"reads the StartUpCurrentLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpCurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("StartUpCurrentLevel", actualValue,
                    mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("startUpCurrentLevel", value, StartUpCurrentLevelValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesBackDefaultValueOfOnOffTransitionTimeAttribute_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"writes back default value of OnOffTransitionTime attribute Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_3_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_3_1()
        : TestCommandBridge("Test_TC_LVL_3_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_3_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_3_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_3_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Off command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime =0 "
                "(immediate)\n");
            if (ShouldSkip("LVL.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelWithOnOffCommandToDutWithLevel50AndTransitionTime0Immediate_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends On command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 s). "
                "This means the level should increase by 150 units in 30s, so 5 units/s\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10000ms\n");
            err = TestWait10000ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10000ms\n");
            err = TestWait10000ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10000ms\n");
            err = TestWait10000ms_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 5000ms\n");
            err = TestWait5000ms_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_45();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 46;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelWithOnOffCommandToDutWithLevel50AndTransitionTime0Immediate_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelWithOnOffParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithOnOffWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime "
                                               @"=0 (immediate) Error: %@",
                                             err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:200U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 "
                                      @"s). This means the level should increase by 150 units in 30s, so 5 units/s Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionsAttribute_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:100U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:140U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:160U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1ToTheOptionsAttribute_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 1 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionsAttribute_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:100U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:140U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:160U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_4_1()
        : TestCommandBridge("Test_TC_LVL_4_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_4_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the MaxLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMaxLevelAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s)\n");
            if (ShouldSkip("LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveWithOnOffCommandToDutWithMoveMode0x00UpAndRate10UnitsS_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5000ms\n");
            err = TestWait5000ms_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithMoveMode0x00UpAndRate5UnitsS_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 10s\n");
            err = TestWait10s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 19s\n");
            err = TestWait19s_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_25();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 26;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMaxLevelAttributeFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MaxLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("maxLevel", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveWithOnOffCommandToDutWithMoveMode0x00UpAndRate10UnitsS_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveWithOnOffParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:10U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s) "
                                        @"Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable CurrentLevelValue;

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
            }
            {
                CurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithMoveMode0x00UpAndRate5UnitsS_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s) Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_16()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_18()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_20()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 230U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait19s_22()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 19000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_5_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_5_1()
        : TestCommandBridge("Test_TC_LVL_5_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_5_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_5_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_5_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and "
                "TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStepWithOnOffCommandToDutWithStepMode0x00UpStepSize50AndTransitionTime0Immediate_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads current level attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and "
                "TransitionTime =300\n");
            if (ShouldSkip("LVL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 10s\n");
            err = TestWait10s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 10s\n");
            err = TestWait10s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 10s\n");
            err = TestWait10s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 5000ms\n");
            err = TestWait5000ms_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH reads CurrentLevel attribute from DUT (after DUT has finished the transition)\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDutAfterDutHasFinishedTheTransition_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAStepWithOnOffCommandToDutWithStepMode0x00UpStepSize50AndTransitionTime0Immediate_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStepWithOnOffParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:0U];
        params.stepSize = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and "
                                        @"TransitionTime =0 (immediate) Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads current level attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStepParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:0U];
        params.stepSize = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and TransitionTime "
                               @"=300 Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_16()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_18()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDutAfterDutHasFinishedTheTransition_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT (after DUT has finished the transition) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_6_1()
        : TestCommandBridge("Test_TC_LVL_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_6_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 5000ms\n");
            err = TestWait5000ms_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends stop command to DUT\n");
            if (ShouldSkip("LVL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsStopCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Physically verify that the device has stopped transitioning\n");
            if (ShouldSkip("PICS_USER_PROMPT && LVL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5000ms\n");
            err = TestWait5000ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends a StopWithOnOff command to the DUT\n");
            if (ShouldSkip("LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStopWithOnOffCommandToTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Physically verify that the device has stopped transitioning\n");
            if (ShouldSkip("PICS_USER_PROMPT && LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate "
                               @"field set to 0x05 (5 units/s) Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestSendsStopCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStopParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Sends stop command to DUT Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_9()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 64U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 86U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate "
                               @"field set to 0x05 (5 units/s) Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsAStopWithOnOffCommandToTheDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStopWithOnOffParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a StopWithOnOff command to the DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LCFG_1_1()
        : TestCommandBridge("Test_TC_LCFG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LCFG_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LCFG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LCFG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLocalizationConfiguration * cluster =
            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLocalizationConfiguration * cluster =
            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLocalizationConfiguration * cluster =
            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLocalizationConfiguration * cluster =
            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLocalizationConfiguration * cluster =
            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LUNIT_1_2()
        : TestCommandBridge("Test_TC_LUNIT_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LUNIT_1_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LUNIT_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LUNIT_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffc && !LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LUNIT.S.Afffc && LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenLunitsf00tempEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("LUNIT.S.Afffb && LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentLUNITSF00AttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads GeneratedCommandList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsGeneratedCommandListFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLunitsf00tempEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentLUNITSF00AttributeInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
                                                                                               endpointID:@(0)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LTIME_1_2()
        : TestCommandBridge("Test_TC_LTIME_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LTIME_1_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LTIME_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LTIME_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            if (ShouldSkip("LTIME.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("LTIME.S.Afffc")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb && LTIME.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeActiveCalendarTypeInAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb && LTIME.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSupportedCalendarTypesInAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("LTIME.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads GeneratedCommandList from DUT\n");
            if (ShouldSkip("LTIME.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsGeneratedCommandListFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("featureMap", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeActiveCalendarTypeInAttributeListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSupportedCalendarTypesInAttributeListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTimeFormatLocalization * cluster =
            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LOWPOWER_1_1()
        : TestCommandBridge("Test_TC_LOWPOWER_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LOWPOWER_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LOWPOWER_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LOWPOWER_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AttributeList", [actualValue count], static_cast<uint32_t>(5)));
                VerifyOrReturn(CheckValue("", actualValue[0], 65528UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 65529UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 65531UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 65532UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 65533UL));
            }

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_1_2()
        : TestCommandBridge("Test_TC_KEYPADINPUT_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_1_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !KEYPADINPUT.S.NV && KEYPADINPUT.S.LK && !KEYPADINPUT.S.NK ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.NV")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputsnvFeatureMapBitMaskIsSetOrNot_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.LK")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputslkFeatureMapBitMaskIsSetOrNot_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputsnkFeatureMapBitMaskIsSetOrNot_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputsnvFeatureMapBitMaskIsSetOrNot_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputslkFeatureMapBitMaskIsSetOrNot_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputsnkFeatureMapBitMaskIsSetOrNot_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_1_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_1_3()
        : TestCommandBridge("Test_TC_APPLAUNCHER_1_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_1_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_1_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_1_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("APPLAUNCHER.S.AP")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !APPLAUNCHER.S.AP ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(CatalogList) in AttributeList\n");
            if (ShouldSkip("APPLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCatalogListInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(CurrentApp) in AttributeList\n");
            if (ShouldSkip("APPLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentAppInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 1UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCatalogListInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CatalogList) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentAppInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentApp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_1_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_1_4()
        : TestCommandBridge("Test_TC_MEDIAINPUT_1_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_1_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_1_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_1_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !MEDIAINPUT.S.NU ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAINPUT.S.NU")) {
                NextTest();
                return;
            }
            err = TestGivenMediainputsnuEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(InputList) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeInputListInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(CurrentInput) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentInputInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediainputsnuEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeInputListInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(InputList) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentInputInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentInput) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_1_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WAKEONLAN_1_5()
        : TestCommandBridge("Test_TC_WAKEONLAN_1_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WAKEONLAN_1_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WAKEONLAN_1_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WAKEONLAN_1_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(MACAddress) in AttributeList\n");
            if (ShouldSkip("WAKEONLAN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMACAddressInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMACAddressInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MACAddress) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_1_6 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_1_6()
        : TestCommandBridge("Test_TC_CHANNEL_1_6")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_1_6() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_1_6\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_1_6\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given CHANNEL.S.CL ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CHANNEL.S.CL")) {
                NextTest();
                return;
            }
            err = TestGivenChannelsclEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given CHANNEL.S.LI ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CHANNEL.S.LI")) {
                NextTest();
                return;
            }
            err = TestGivenChannelsliEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(ChannelList): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeChannelListAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reading optional attribute(Lineup) in AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadingOptionalAttributeLineupInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(CurrentChannel): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentChannelAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional command(ChangeChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the optional command(ChangeChannelByNumber) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional command(SkipChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeGeneratedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip("CHANNEL.S.CL || CHANNEL.S.LI")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeGeneratedCommandList_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenChannelsclEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CHANNEL.S.CL ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenChannelsliEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CHANNEL.S.LI ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeChannelListAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ChannelList): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingOptionalAttributeLineupInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reading optional attribute(Lineup) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentChannelAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentChannel): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(ChangeChannel) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(ChangeChannelByNumber) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipChannel) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_1_7 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_1_7()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_1_7")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_1_7() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_1_7\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_1_7\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !MEDIAPLAYBACK.S.AS && !MEDIAPLAYBACK.S.VS ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.AS")) {
                NextTest();
                return;
            }
            err = TestGivenMediaplaybacksasEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.VS")) {
                NextTest();
                return;
            }
            err = TestGivenMediaplaybacksvsEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(StartTime) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartTimeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(Duration) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDurationInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(SampledPosition) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSampledPositionInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(PlaybackSpeed) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePlaybackSpeedInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(SeekRangeEnd) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeEndInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute(SeekRangeStart) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeStartInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional command(StartOver) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStartOverInAcceptedCommandList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional command(Previous) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandPreviousInAcceptedCommandList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the optional command(Next) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandNextInAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read the optional command(Rewind) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandRewindInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the optional command(FastForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandFastForwardInAcceptedCommandList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional command(SkipForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the optional command(SkipBackward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read the optional command(Seek) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSeekInAcceptedCommandList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediaplaybacksasEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediaplaybacksvsEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeStartTimeInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(StartTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDurationInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Duration) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSampledPositionInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SampledPosition) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePlaybackSpeedInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(PlaybackSpeed) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSeekRangeEndInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SeekRangeEnd) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSeekRangeStartInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SeekRangeStart) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStartOverInAcceptedCommandList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StartOver) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandPreviousInAcceptedCommandList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Previous) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandNextInAcceptedCommandList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Next) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandRewindInAcceptedCommandList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Rewind) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandFastForwardInAcceptedCommandList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(FastForward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipForward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipBackward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSeekInAcceptedCommandList_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Seek) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_1_8 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_1_8()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_1_8")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_1_8() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_1_8\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_1_8\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("featureMap", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_1_9 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_1_9()
        : TestCommandBridge("Test_TC_TGTNAV_1_9")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_1_9() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_1_9\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_1_9\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(CurrentTarget) in AttributeList\n");
            if (ShouldSkip("TGTNAV.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentTargetInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentTargetInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentTarget) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_8_2()
        : TestCommandBridge("Test_TC_TGTNAV_8_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_8_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_8_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_8_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 0;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;
};

class Test_TC_APBSC_1_10 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APBSC_1_10()
        : TestCommandBridge("Test_TC_APBSC_1_10")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APBSC_1_10() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APBSC_1_10\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APBSC_1_10\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(VendorName) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeVendorNameInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(VendorID) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeVendorIDInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(ProductID) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeProductIDInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeVendorNameInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(VendorName) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeVendorIDInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(VendorID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeProductIDInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ProductID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_1_11 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CONTENTLAUNCHER_1_11()
        : TestCommandBridge("Test_TC_CONTENTLAUNCHER_1_11")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CONTENTLAUNCHER_1_11() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CONTENTLAUNCHER_1_11\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CONTENTLAUNCHER_1_11\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("( !CONTENTLAUNCHER.S.CS && !CONTENTLAUNCHER.S.UP )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.CS")) {
                NextTest();
                return;
            }
            err = TestGivenContentlauncherscsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.UP")) {
                NextTest();
                return;
            }
            err = TestGivenContentlaunchersupEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(AcceptHeader): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeAcceptHeaderAttributeList_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the optional attribute(SupportedStreamingProtocols): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read the optional command(LaunchContent) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C00.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read the optional command(LaunchURL) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C01.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenContentlauncherscsEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenContentlaunchersupEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeAcceptHeaderAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(AcceptHeader): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SupportedStreamingProtocols): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(LaunchContent) in AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(LaunchURL) in AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_1_12 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ALOGIN_1_12()
        : TestCommandBridge("Test_TC_ALOGIN_1_12")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ALOGIN_1_12() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ALOGIN_1_12\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ALOGIN_1_12\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Sleep command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_3_2()
        : TestCommandBridge("Test_TC_KEYPADINPUT_3_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_3_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_3_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_3_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends CEC Settings Keys(0x0A) to DUT\n");
            if (ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsCecSettingsKeys0x0AToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends CEC Home Keys(0x09) to DUT\n");
            if (ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsCecHomeKeys0x09ToDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsCecSettingsKeys0x0AToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:10U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"TH sends CEC Settings Keys(0x0A) to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsCecHomeKeys0x09ToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:9U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"TH sends CEC Home Keys(0x09) to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_3_3()
        : TestCommandBridge("Test_TC_KEYPADINPUT_3_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_3_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_3_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_3_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Numbers1\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers1_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Numbers2\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers2_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Numbers3\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers3_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Send Numbers4\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers4_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send Numbers5\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers5_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Send Numbers6\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers6_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Send Numbers7\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers7_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Send Numbers8\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers8_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Send Numbers9\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers9_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendNumbers1_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:33U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers1 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers2_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:34U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers2 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers3_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:35U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers3 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers4_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:36U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers4 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers5_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:37U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers5 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers6_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:38U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers6 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers7_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:39U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers7 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers8_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:40U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers8 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers9_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:41U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers9 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_3_5()
        : TestCommandBridge("Test_TC_APPLAUNCHER_3_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_3_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_3_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_3_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads CatalogList attribute from the DUT and where each entry in the list is a CSA-issued "
                "Vendor Id of type unsigned 16 bit integer ranging between 0-65536 for the catalog\n");
            if (ShouldSkip("APPLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCatalogListAttributeFromTheDutAndWhereEachEntryInTheListIsACsaIssuedVendorIdOfTypeUnsigned16BitIntegerRangingBetween065536ForTheCatalog_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsCatalogListAttributeFromTheDutAndWhereEachEntryInTheListIsACsaIssuedVendorIdOfTypeUnsigned16BitIntegerRangingBetween065536ForTheCatalog_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CatalogList attribute from the DUT and where each entry in the list is a CSA-issued Vendor Id of type "
                  @"unsigned 16 bit integer ranging between 0-65536 for the catalog Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_6 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_3_6()
        : TestCommandBridge("Test_TC_APPLAUNCHER_3_6")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_3_6() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_3_6\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_3_6\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads CurrentApp attribute from the DUT and Verify the in-focus application attributes, "
                "which should include the display Application ID(type:uint16) Catalog Vendor ID(type:string) or Null if there is "
                "no current in-focus application\n");
            if (ShouldSkip("APPLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentAppAttributeFromTheDutAndVerifyTheInFocusApplicationAttributesWhichShouldIncludeTheDisplayApplicationIDtypeuint16CatalogVendorIDtypestringOrNullIfThereIsNoCurrentInFocusApplication_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsCurrentAppAttributeFromTheDutAndVerifyTheInFocusApplicationAttributesWhichShouldIncludeTheDisplayApplicationIDtypeuint16CatalogVendorIDtypestringOrNullIfThereIsNoCurrentInFocusApplication_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEP * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentApp attribute from the DUT and Verify the in-focus application attributes, which should "
                  @"include the display Application ID(type:uint16) Catalog Vendor ID(type:string) or Null if there is no current "
                  @"in-focus application Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_10 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_10()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_10")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_10() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_10\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_10\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads the InputList attribute from the DUT to show list of Inputs available and Verify "
                "list of available inputs supported by the device is provided, where each entry in the list contains an "
                "index(type:uint 8), InputType (InputType Enums), Name (type: Strings), and Description(Type:String)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                  @"inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                  @"InputType (InputType Enums), Name (type: Strings), and Description(Type:String) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_11 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_11()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_11")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_11() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_11\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_11\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads the InputList attribute from the DUT to show list of Inputs available and Verify "
                "list of available inputs supported by the device is provided, where each entry in the list contains an "
                "index(type:uint 8), InputType (InputType Enums), Name (type: Strings), and Description(Type:String)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Select Input Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSelectInputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read current input list\n");
            if (ShouldSkip("MEDIAINPUT.S.A0001 && MEDIAINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadCurrentInputList_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                  @"inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                  @"InputType (InputType Enums), Name (type: Strings), and Description(Type:String) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectInputCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Select Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentInputList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentInput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_12 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_12()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_12")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_12() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_12\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_12\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads the InputList attribute from the DUT to show list of Inputs available and Verify "
                "list of available inputs supported by the device is provided, where each entry in the list contains an "
                "index(type:uint 8), InputType (InputType Enums), Name (type: Strings), and Description(Type:String)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Show Input Status Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestShowInputStatusCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Hide Input Status Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestHideInputStatusCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                  @"inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                  @"InputType (InputType Enums), Name (type: Strings), and Description(Type:String) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestShowInputStatusCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Show Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideInputStatusCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Hide Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_13 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_13()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_13")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_13() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_13\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_13\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : TH reads the InputList attribute from the DUT to show list of Inputs available\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Rename Input Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestRenameInputCommand_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : TH reads the InputList attribute from the DUT to show list of Inputs available\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAINPUT.S.A0000 && MEDIAINPUT.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the InputList attribute from the DUT to show list of Inputs available Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameInputCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"A1";
        [cluster renameInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Rename Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_3()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_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
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ChannelList attribute from the DUT to show list of Inputs available and Verify that the response "
                  @"contains a list of the known TV channels. Each list element should consist of the following,Major number "
                  @"(unsigned 16-bit integer, mandatory),Minor number (unsigned 16-bit integer, mandatory),Name (String, "
                  @"optional),Call sign (String, optional),Affiliate call sign (String, optional) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_5_2()
        : TestCommandBridge("Test_TC_CHANNEL_5_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_5_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_5_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_5_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the ChannelList attribute\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheChannelListAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends a ChangeChannelByNumber command\n");
            if (ShouldSkip("CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAChangeChannelByNumberCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Verify that the channel has changed on the device\n");
            if (ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheChannelHasChangedOnTheDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the CurrentChannel attribute\n");
            if (ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheChannelListAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ChannelList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("channelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAChangeChannelByNumberCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
        params.majorNumber = mMajornumber.HasValue() ? [NSNumber numberWithUnsignedShort:mMajornumber.Value()]
                                                     : [NSNumber numberWithUnsignedShort:9U];
        params.minorNumber = mMinornumber.HasValue() ? [NSNumber numberWithUnsignedShort:mMinornumber.Value()]
                                                     : [NSNumber numberWithUnsignedShort:1U];
        [cluster changeChannelByNumberWithParams:params
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"TH sends a ChangeChannelByNumber command Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_3()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads the CurrentChannel attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_5_3()
        : TestCommandBridge("Test_TC_CHANNEL_5_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_5_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_5_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_5_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH reads the Lineup attribute from the DUT to show list of Inputs available and Verify that "
                "the response contains a lineup info object\n");
            if (ShouldSkip("CHANNEL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheLineupAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsALineupInfoObject_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the ChannelList attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheChannelListAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the CurrentChannel attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Sends a SkipChannel command to the DUT\n");
            if (ShouldSkip("CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipChannelCommandToTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Verify that the channel has changed on the device\n");
            if (ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheChannelHasChangedOnTheDevice_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the CurrentChannel attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttributeFromTheDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheLineupAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsALineupInfoObject_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Lineup attribute from the DUT to show list of Inputs available and Verify that the response "
                  @"contains a lineup info object Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheChannelListAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ChannelList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("channelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads the CurrentChannel attribute from the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASkipChannelCommandToTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a SkipChannel command to the DUT Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_5()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads the CurrentChannel attribute from the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
                }
                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentChannel", "ChannelInfo", "ChannelInfo"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_1()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a Play command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : sends a Pause command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPauseCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Verify that the media is paused\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsPaused_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp && MEDIAPLAYBACK.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Sends a Stop command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAStopCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify that the media is stoped\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsStoped_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPlayCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPauseCommand_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"sends a Pause command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsPaused_7()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media state is pausedgarbage: not in length on purpose", 41);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAStopCommand_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopPlaybackWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Stop command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsStoped_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media state is stopedgarbage: not in length on purpose", 41);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_2()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a Play command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommandToTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Sends a StartOver command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAStartOverCommandToTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Verify that the media is started over\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsStartedOver_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends a Next command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsANextCommandToTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Verify that the next media item in the queue has been loaded\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheNextMediaItemInTheQueueHasBeenLoaded_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Sends a Previous command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPreviousCommandToTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Verify that the previous media item in the queue has been loaded\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatThePreviousMediaItemInTheQueueHasBeenLoaded_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Sends a SkipForward command to the DUT \n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipForwardCommandToTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Verify that the media has skipped forward 10 seconds\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasSkippedForward10Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the SampledPosition attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttributeFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Sends a SkipBackward command to the DUT \n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipBackwardCommandToTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Verify that the media has skipped backward 10 seconds\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasSkippedBackward10Seconds_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the SampledPosition attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttributeFromTheDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPlayCommandToTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAStartOverCommandToTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            startOverWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a StartOver command to the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsStartedOver_7()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media is started overgarbage: not in length on purpose", 41);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsANextCommandToTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Next command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheNextMediaItemInTheQueueHasBeenLoaded_9()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media item in the queue has been loadedgarbage: not in length on purpose", 59);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsAPreviousCommandToTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            previousWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a Previous command to the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatThePreviousMediaItemInTheQueueHasBeenLoaded_11()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if previous media item in the queue has been loadedgarbage: not in length on purpose", 68);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsASkipForwardCommandToTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipForwardWithParams:params
                       completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Sends a SkipForward command to the DUT  Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.status;
                               VerifyOrReturn(CheckValue("status", actualValue, 0U));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasSkippedForward10Seconds_13()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media has skipped forward 10 secondsgarbage: not in length on purpose", 56);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASkipBackwardCommandToTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipBackwardWithParams:params
                        completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Sends a SkipBackward command to the DUT  Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasSkippedBackward10Seconds_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media has skipped backward 10 secondsgarbage: not in length on purpose", 57);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_3()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("SeekPosition", 0, UINT64_MAX, &mSeekPosition);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a Seek command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASeekCommand_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Verify that the media has moved to 10 seconds from the starting point\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasMovedTo10SecondsFromTheStartingPoint_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the SampledPosition attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the StartTime attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0001 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsTheStartTimeAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the SeekRangeEnd attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSeekRangeEndAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the SeekRangeStart attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSeekRangeStartAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads the Duration attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheDurationAttributeFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Sends a Seek command Position value beyond the furthest valid position\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASeekCommandPositionValueBeyondTheFurthestValidPosition_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : verify that the media has not moved.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasNotMoved_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint64_t> mSeekPosition;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASeekCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Sends a Seek command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("status", actualValue, 0U));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasMovedTo10SecondsFromTheStartingPoint_3()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media has moved to 10 seconds from the starting pointgarbage: not in length on purpose", 73);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheStartTimeAttributeFromTheDut_5()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSeekRangeEndAttributeFromTheDut_6()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSeekRangeStartAttributeFromTheDut_7()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheDurationAttributeFromTheDut_8()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsASeekCommandPositionValueBeyondTheFurthestValidPosition_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = mSeekPosition.HasValue() ? [NSNumber numberWithUnsignedLongLong:mSeekPosition.Value()]
                                                   : [NSNumber numberWithUnsignedLongLong:100000000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Sends a Seek command Position value beyond the furthest valid position Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("status", actualValue, 5U));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasNotMoved_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media has not movedgarbage: not in length on purpose", 39);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_MEDIAPLAYBACK_6_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_4()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Sends a FastForward command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAFastForwardCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends a FastForward command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAFastForwardCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : verify that the media play speed has increased.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlaySpeedHasIncreased_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : verify that the media play has reversed direction.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlayHasReversedDirection_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : verify that the media play speed has increased in the reverse direction.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlaySpeedHasIncreasedInTheReverseDirection_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Sends a Play command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommand_18();
            break;
        case 19:
            ChipLogProgress(
                chipTool, " ***** Test Step 19 : verify that the media is has resumed playing forward at the default speed.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsHasResumedPlayingForwardAtTheDefaultSpeed_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Sends consecutive FastForward commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveFastForwardCommands_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Sends consecutive Rewind commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveRewindCommands_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAFastForwardCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a FastForward command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_5()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 1.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAFastForwardCommand_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a FastForward command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreased_9()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if media play speed has increased.garbage: not in length on purpose", 51);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 2.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsARewindCommandToTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Rewind command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlayHasReversedDirection_12()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if media play has reversed directiongarbage: not in length on purpose", 53);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -1garbage: not in length on purpose", 45);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsARewindCommandToTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Rewind command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreasedInTheReverseDirection_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media play speed has increased in the reverse directiongarbage: not in length on purpose", 75);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_17()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -2garbage: not in length on purpose", 45);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsAPlayCommand_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsHasResumedPlayingForwardAtTheDefaultSpeed_19()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media is has resumed playing forward at the default speedgarbage: not in length on purpose", 77);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(1)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 1.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsConsecutiveFastForwardCommands_21()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestSendsConsecutiveRewindCommands_22()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_AUDIOOUTPUT_7_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_7_1()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_7_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_7_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_7_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_7_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OutputList attribute\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a SelectAudioOutput command\n");
            if (ShouldSkip("AUDIOOUTPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASelectAudioOutputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the CurrentOutput attribute\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentOutputAttribute_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mIndex;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheOutputListAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OutputList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("outputList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASelectAudioOutputCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = mIndex.HasValue() ? [NSNumber numberWithUnsignedChar:mIndex.Value()] : [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Sends a SelectAudioOutput command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentOutputAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentOutput attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentOutput", actualValue, mIndex.HasValue() ? mIndex.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_7_2()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_7_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_7_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_7_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_7_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OutputList attribute from the DUT\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a RenameOutput command\n");
            if (ShouldSkip("AUDIOOUTPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARenameOutputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : Reads the OutputList attribute from the DUT Verify that the output at the index provided in "
                "step 2 has the name CertTest\n");
            if (ShouldSkip("PICS_USER_PROMPT && AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttributeFromTheDutVerifyThatTheOutputAtTheIndexProvidedInStep2HasTheNameCertTest_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mIndex;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSArray * _Nonnull audioOutputListValues;

    CHIP_ERROR TestReadsTheOutputListAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OutputList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("outputList", "list", "list"));
            {
                audioOutputListValues = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsARenameOutputCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
        params.index = mIndex.HasValue() ? [NSNumber numberWithUnsignedChar:mIndex.Value()] : [NSNumber numberWithUnsignedChar:1U];
        params.name = @"CertTest";
        [cluster renameOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Sends a RenameOutput command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOutputListAttributeFromTheDutVerifyThatTheOutputAtTheIndexProvidedInStep2HasTheNameCertTest_3()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_TGTNAV_8_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_8_1()
        : TestCommandBridge("Test_TC_TGTNAV_8_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("targetvalue", 0, UINT8_MAX, &mTargetvalue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_8_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_8_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_8_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the CurrentTarget attribute\n");
            if (ShouldSkip("TGTNAV.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentTargetAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the TargetList attribute\n");
            if (ShouldSkip("TGTNAV.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheTargetListAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a NavigateTarget command\n");
            if (ShouldSkip("TGTNAV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsANavigateTargetCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the CurrentTarget attribute\n");
            if (ShouldSkip("TGTNAV.S.A0001 && TGTNAV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentTargetAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mTargetvalue;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentTargetAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentTarget attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentTarget", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentTarget", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentTarget", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSArray * _Nonnull TargetListValues;

    CHIP_ERROR TestReadsTheTargetListAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the TargetList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("targetList", "list", "list"));
            {
                TargetListValues = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsANavigateTargetCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
        params.target = mTargetvalue.HasValue() ? [NSNumber numberWithUnsignedChar:mTargetvalue.Value()]
                                                : [NSNumber numberWithUnsignedChar:1U];
        [cluster navigateTargetWithParams:params
                               completion:^(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Sends a NavigateTarget command Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentTargetAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentTarget attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentTarget", actualValue, mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_9_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APBSC_9_1()
        : TestCommandBridge("Test_TC_APBSC_9_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APBSC_9_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APBSC_9_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APBSC_9_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the VendorName attribute\n");
            if (ShouldSkip("APBSC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheVendorNameAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the VendorID attribute\n");
            if (ShouldSkip("APBSC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheVendorIDAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the ApplicationName attribute\n");
            if (ShouldSkip("APBSC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationNameAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the ProductID attribute\n");
            if (ShouldSkip("APBSC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsTheProductIDAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the Application attribute\n");
            if (ShouldSkip("APBSC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the Status attribute\n");
            if (ShouldSkip("APBSC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsTheStatusAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the ApplicationVersion attribute\n");
            if (ShouldSkip("APBSC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationVersionAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the AllowedVendorList attribute\n");
            if (ShouldSkip("APBSC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsTheAllowedVendorListAttribute_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheVendorNameAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the VendorName attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("vendorName", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("vendorName", value, 32));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheVendorIDAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the VendorID attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("vendorID", "vendor_id", "vendor_id"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationNameAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ApplicationName attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("applicationName", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("applicationName", value, 256));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheProductIDAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ProductID attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("productID", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("productID", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("productID", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationBasicApplication * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Application attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("application", "ApplicationBasicApplication", "ApplicationBasicApplication"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStatusAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Status attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("status", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("status", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationVersionAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ApplicationVersion attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("applicationVersion", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("applicationVersion", value, 32));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAllowedVendorListAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the AllowedVendorList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("allowedVendorList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CONTENTLAUNCHER_10_1()
        : TestCommandBridge("Test_TC_CONTENTLAUNCHER_10_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CONTENTLAUNCHER_10_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CONTENTLAUNCHER_10_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CONTENTLAUNCHER_10_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the AcceptHeader attribute from the DUT\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAcceptHeaderAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the SupportedStreamingProtocols attribute from the DUT\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSupportedStreamingProtocolsAttributeFromTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheAcceptHeaderAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptHeader attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptHeader", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheSupportedStreamingProtocolsAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the SupportedStreamingProtocols attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportedStreamingProtocols", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MOD_1_1()
        : TestCommandBridge("Test_TC_MOD_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MOD_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MOD_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MOD_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            if (ShouldSkip("MOD.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the FeatureMap attribute from the DUT\n");
            if (ShouldSkip(" !MOD.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH reads the optional attribute(StartUpMode) in AttributeList from the DUT\n");
            if (ShouldSkip("MOD.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOptionalAttributeStartUpModeInAttributeListFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : TH reads the optional attribute(OnMode) in AttributeList from the DUT\n");
            if (ShouldSkip("MOD.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOptionalAttributeOnModeInAttributeListFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 1UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheOptionalAttributeStartUpModeInAttributeListFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the optional attribute(StartUpMode) in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheOptionalAttributeOnModeInAttributeListFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the optional attribute(OnMode) in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class OTA_SuccessfulTransfer : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    OTA_SuccessfulTransfer()
        : TestCommandBridge("OTA_SuccessfulTransfer")
        , mTestIndex(0)
    {
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("requestorNodeId", 0, UINT64_MAX, &mRequestorNodeId);
        AddArgument("providerNodeId", 0, UINT64_MAX, &mProviderNodeId);
        AddArgument("providerPayload", &mProviderPayload);
        AddArgument("providerDiscriminator", 0, UINT16_MAX, &mProviderDiscriminator);
        AddArgument("providerPort", 0, UINT16_MAX, &mProviderPort);
        AddArgument("providerKvs", &mProviderKvs);
        AddArgument("otaImageFilePath", &mOtaImageFilePath);
        AddArgument("rawImageFilePath", &mRawImageFilePath);
        AddArgument("rawImageContent", &mRawImageContent);
        AddArgument("downloadImageFilePath", &mDownloadImageFilePath);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~OTA_SuccessfulTransfer() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: OTA_SuccessfulTransfer\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: OTA_SuccessfulTransfer\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Create OTA image\n");
            err = TestCreateOtaImage_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Start the provider with an image\n");
            err = TestStartTheProviderWithAnImage_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Commission the provider from alpha\n");
            err = TestCommissionTheProviderFromAlpha_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait for the commissioned provider to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedProviderToBeRetrievedForAlpha_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Install ACL for QueryImage\n");
            err = TestInstallAclForQueryImage_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Stop the requestor\n");
            err = TestStopTheRequestor_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Start the requestor with an OTA download path\n");
            err = TestStartTheRequestorWithAnOtaDownloadPath_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned requestor to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedRequestorToBeRetrievedForAlpha_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Send an announce OTA provider command to the requestor\n");
            err = TestSendAnAnnounceOtaProviderCommandToTheRequestor_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait for transfer complete message\n");
            err = TestWaitForTransferCompleteMessage_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Compare original file to downloaded file\n");
            err = TestCompareOriginalFileToDownloadedFile_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::NodeId> mRequestorNodeId;
    chip::Optional<chip::NodeId> mProviderNodeId;
    chip::Optional<chip::CharSpan> mProviderPayload;
    chip::Optional<uint16_t> mProviderDiscriminator;
    chip::Optional<uint16_t> mProviderPort;
    chip::Optional<chip::CharSpan> mProviderKvs;
    chip::Optional<chip::CharSpan> mOtaImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageContent;
    chip::Optional<chip::CharSpan> mDownloadImageFilePath;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestCreateOtaImage_0()
    {
        chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type value;
        value.otaImageFilePath
            = mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
        value.rawImageFilePath
            = mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
        value.rawImageContent
            = mRawImageContent.HasValue() ? mRawImageContent.Value() : chip::Span<const char>("Have a hootenanny!", 18);
        return CreateOtaImage("alpha", value);
    }

    CHIP_ERROR TestStartTheProviderWithAnImage_1()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-ota-provider-appgarbage: not in length on purpose", 21);
        value.discriminator.Emplace();
        value.discriminator.Value() = mProviderDiscriminator.HasValue() ? mProviderDiscriminator.Value() : 50U;
        value.port.Emplace();
        value.port.Value() = mProviderPort.HasValue() ? mProviderPort.Value() : 5560U;
        value.kvs.Emplace();
        value.kvs.Value() = mProviderKvs.HasValue() ? mProviderKvs.Value() : chip::Span<const char>("/tmp/chip_kvs_provider", 22);
        value.filepath.Emplace();
        value.filepath.Value()
            = mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
        return Start("alpha", value);
    }

    CHIP_ERROR TestCommissionTheProviderFromAlpha_2()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
        value.payload
            = mProviderPayload.HasValue() ? mProviderPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
        return PairWithCode("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedProviderToBeRetrievedForAlpha_3()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestInstallAclForQueryImage_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = [NSNumber numberWithUnsignedInt:41UL];
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Install ACL for QueryImage Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStopTheRequestor_5()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheRequestorWithAnOtaDownloadPath_6()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.otaDownloadPath.Emplace();
        value.otaDownloadPath.Value() = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                                          : chip::Span<const char>("/tmp/downloadedImage", 20);
        return Start("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedRequestorToBeRetrievedForAlpha_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mRequestorNodeId.HasValue() ? mRequestorNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendAnAnnounceOtaProviderCommandToTheRequestor_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
        params.providerNodeId = mProviderNodeId.HasValue() ? [NSNumber numberWithUnsignedLongLong:mProviderNodeId.Value()]
                                                           : [NSNumber numberWithUnsignedLongLong:12648430ULL];
        params.vendorId = [NSNumber numberWithUnsignedShort:0U];
        params.announcementReason = [NSNumber numberWithUnsignedChar:0U];
        params.endpoint
            = mEndpoint.HasValue() ? [NSNumber numberWithUnsignedShort:mEndpoint.Value()] : [NSNumber numberWithUnsignedShort:0U];
        [cluster announceOtaProviderWithParams:params
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Send an announce OTA provider command to the requestor Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitForTransferCompleteMessage_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
        value.message = chip::Span<const char>("OTA image downloadedgarbage: not in length on purpose", 20);
        return WaitForMessage("alpha", value);
    }

    CHIP_ERROR TestCompareOriginalFileToDownloadedFile_10()
    {
        chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type value;
        value.file1 = mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
        value.file2 = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                        : chip::Span<const char>("/tmp/downloadedImage", 20);
        return CompareFiles("alpha", value);
    }
};

class Test_TC_OCC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OCC_1_1()
        : TestCommandBridge("Test_TC_OCC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OCC_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OCC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OCC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OCC_2_1()
        : TestCommandBridge("Test_TC_OCC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OCC_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OCC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OCC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads mandatory attribute constrains: Occupancy\n");
            if (ShouldSkip("OCC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancy_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads mandatory attribute constrains: OccupancySensorType\n");
            if (ShouldSkip("OCC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorType_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads mandatory attribute constrains: OccupancySensorTypeBitmap\n");
            if (ShouldSkip("OCC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads optional attribute: PIROccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedDelay_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedThreshold_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeUltrasonicOccupiedToUnoccupiedDelay_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute: UltrasonicUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestReadAttributeUltrasonicUnoccupiedToOccupiedDelay_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read attribute: UltrasonicUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0022")) {
                NextTest();
                return;
            }
            err = TestReadAttributeUltrasonicUnoccupiedToOccupiedThreshold_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0030")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactOccupiedToUnoccupiedDelay_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0031")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedDelay_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0032")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedThreshold_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancy_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: Occupancy Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancy", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancy", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancy", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorType_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorType Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeBitmapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorTypeBitmap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorTypeBitmap", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute: PIROccupiedToUnoccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("pirOccupiedToUnoccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("pirOccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("pirOccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedDelay_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("pirUnoccupiedToOccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("pirUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("pirUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedThreshold_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("pirUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("pirUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("pirUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeUltrasonicOccupiedToUnoccupiedDelay_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUltrasonicOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                VerifyOrReturn(CheckConstraintType("ultrasonicOccupiedToUnoccupiedDelay", "int16u", "int16u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint16_t>("ultrasonicOccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("ultrasonicOccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedDelay_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUltrasonicUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read attribute: UltrasonicUnoccupiedToOccupiedDelay Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                VerifyOrReturn(CheckConstraintType("ultrasonicUnoccupiedToOccupiedDelay", "int16u", "int16u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint16_t>("ultrasonicUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("ultrasonicUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedThreshold_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: UltrasonicUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("ultrasonicUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("ultrasonicUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("ultrasonicUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactOccupiedToUnoccupiedDelay_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactOccupiedToUnoccupiedDelayWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactOccupiedToUnoccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("physicalContactOccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("physicalContactOccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedDelay_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedDelayWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactUnoccupiedToOccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("physicalContactUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("physicalContactUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedThreshold_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                               endpointID:@(1)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("physicalContactUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("physicalContactUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_1_1()
        : TestCommandBridge("Test_TC_OO_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !OO.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given OO.S.F00(LT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenOosf00ltEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the feature dependent(OO.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentOOSF00AttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the feature dependent(OO.S.F00) commands in AcceptedCommandList\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentOOSF00CommandsInAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenOosf00ltEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given OO.S.F00(LT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentOOSF00AttributeInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the feature dependent(OO.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16384UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16385UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16386UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16387UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentOOSF00CommandsInAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the feature dependent(OO.S.F00) commands in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 64UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 65UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 66UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_1()
        : TestCommandBridge("Test_TC_OO_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: OnOff\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeOnOff_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read LT attribute: GlobalSceneControl\n");
            if (ShouldSkip("OO.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeGlobalSceneControl_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read LT attribute: OnTime\n");
            if (ShouldSkip("OO.S.A4001")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeOnTime_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read LT attribute: OffWaitTime\n");
            if (ShouldSkip("OO.S.A4002")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeOffWaitTime_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read LT attribute: StartUpOnOff\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeStartUpOnOff_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeOnOff_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOff", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeGlobalSceneControl_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGlobalSceneControlWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: GlobalSceneControl Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("globalSceneControl", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeOnTime_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: OnTime Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeOffWaitTime_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffWaitTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: OffWaitTime Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("offWaitTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offWaitTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offWaitTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeStartUpOnOff_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: StartUpOnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpOnOff", "enum8", "enum8"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_2()
        : TestCommandBridge("Test_TC_OO_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOnCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOnCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Send Toggle Command\n");
            if (ShouldSkip("OO.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendToggleCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 1000ms\n");
            err = TestWait1000ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Check on/off attribute value is true after toggle command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterToggleCommand_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Send Toggle Command\n");
            if (ShouldSkip("OO.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendToggleCommand_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 1000ms\n");
            err = TestWait1000ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Check on/off attribute value is false after toggle command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterToggleCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Operate on device to set OnOff attribute manually to on\n");
            if (ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToSetOnOffAttributeManuallyToOn_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Operate on device to set OnOff attribute manually to off\n");
            if (ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToSetOnOffAttributeManuallyToOff_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Reset Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestResetOffCommand_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendOffCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendToggleCommand_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Toggle Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait1000ms_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterToggleCommand_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after toggle command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendToggleCommand_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Toggle Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait1000ms_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterToggleCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after toggle command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOn_17()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOff_19()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestResetOffCommand_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Reset Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_4()
        : TestCommandBridge("Test_TC_OO_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes a value of 0 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf0ToStartUpOnOffAttributeOfDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH writes a value of 1 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf1ToStartUpOnOffAttributeOfDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH writes a value of 2 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf2ToStartUpOnOffAttributeOfDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH writes NULL to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesNullToStartUpOnOffAttributeOfDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsOnCommandToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf0ToStartUpOnOffAttributeOfDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 0 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_3()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_4()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf1ToStartUpOnOffAttributeOfDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 1 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_8()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_9()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf2ToStartUpOnOffAttributeOfDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 2 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_13()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_14()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_17()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_18()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesNullToStartUpOnOffAttributeOfDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = nil;
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes NULL to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_22()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_23()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_24()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_27()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_28()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_29()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PS_1_1()
        : TestCommandBridge("Test_TC_PS_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PS_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PS_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PS_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !PS.S.F00 && !PS.S.F01 && !PS.S.F02 && !PS.S.F03 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given PS.S.F00(WIRED) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenPssf00wiredEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given PS.S.F01(BAT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenPssf01batEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given PS.S.F02(RECHG) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenPssf02rechgEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given PS.S.F03(REPLC) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenPssf03replcEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf00wiredEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F00(WIRED) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf01batEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F01(BAT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf02rechgEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F02(RECHG) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf03replcEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F03(REPLC) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PS_2_1()
        : TestCommandBridge("Test_TC_PS_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PS_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PS_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PS_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Test Harness Client reads Status attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsStatusAttributeFromServerDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Test Harness Client reads Order attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsOrderAttributeFromServerDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Test Harness Client reads Description attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0002")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsDescriptionAttributeFromServerDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT\n");
            if (ShouldSkip("PS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedInputVoltageAttribueFromServerDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0004")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedInputFrequencyAttributeFromServerDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Test Harness Client reads WiredCurrentType attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0005")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredCurrentTypeAttributeFromServerDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Test Harness Client reads WiredAssessedCurrent attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0006")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedCurrentAttributeFromServerDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Test Harness Client reads WiredNominalVoltage from Server DUT\n");
            if (ShouldSkip("PS.S.A0007")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredNominalVoltageFromServerDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Test Harness Client reads WiredMaximumCurrent from Server DUT\n");
            if (ShouldSkip("PS.S.A0008")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredMaximumCurrentFromServerDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Test Harness Client reads WiredPresent from Server DUT\n");
            if (ShouldSkip("PS.S.A0009")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredPresentFromServerDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Test Harness Client reads ActiveWiredFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A000a")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveWiredFaultsFromServerDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Test Harness Client reads BatVoltage from Server DUT\n");
            if (ShouldSkip("PS.S.A000b")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatVoltageFromServerDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Test Harness Client reads BatPercentRemaining from Server DUT\n");
            if (ShouldSkip("PS.S.A000c")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatPercentRemainingFromServerDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Test Harness Client reads BatTimeRemaining from Server DUT\n");
            if (ShouldSkip("PS.S.A000d")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatTimeRemainingFromServerDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Test Harness Client reads BatChargeLevel from Server DUT\n");
            if (ShouldSkip("PS.S.A000e")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargeLevelFromServerDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Test Harness Client reads BatReplacementNeeded from Server DUT\n");
            if (ShouldSkip("PS.S.A000f")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplacementNeededFromServerDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Test Harness Client reads BatReplaceability from Server DUT\n");
            if (ShouldSkip("PS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplaceabilityFromServerDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Test Harness Client reads BatPresent from Server DUT\n");
            if (ShouldSkip("PS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatPresentFromServerDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Test Harness Client readsActiveBatFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveBatFaultsFromServerDut_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : Test Harness Client reads BatReplacementDescription from Server DUT\n");
            if (ShouldSkip("PS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplacementDescriptionFromServerDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Test Harness Client reads BatCommonDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatCommonDesignationFromServerDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Test Harness Client reads BatANSIDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0015")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatANSIDesignationFromServerDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Test Harness Client reads BatIECDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0016")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatIECDesignationFromServerDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Test Harness Client reads BatApprovedChemistry from Server DUT\n");
            if (ShouldSkip("PS.S.A0017")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatApprovedChemistryFromServerDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Test Harness Client reads BatCapacity from Server DUT\n");
            if (ShouldSkip("PS.S.A0018")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatCapacityFromServerDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Test Harness Client reads BatQuantity from Server DUT\n");
            if (ShouldSkip("PS.S.A0019")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatQuantityFromServerDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Test Harness Client reads BatChargeState from Server DUT\n");
            if (ShouldSkip("PS.S.A001a")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargeStateFromServerDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Test Harness Client reads BatTimeToFullCharge from Server DUT\n");
            if (ShouldSkip("PS.S.A001b")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatTimeToFullChargeFromServerDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : Test Harness Client reads BatFunctionalWhileCharging from Server DUT\n");
            if (ShouldSkip("PS.S.A001c")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatFunctionalWhileChargingFromServerDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Test Harness Client reads BatChargingCurrent from Server DUT\n");
            if (ShouldSkip("PS.S.A001d")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargingCurrentFromServerDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Test Harness Client reads ActiveBatChargeFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A001e")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveBatChargeFaultsFromServerDut_31();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 32;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTestHarnessClientReadsStatusAttributeFromServerDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Status attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("status", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("status", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("status", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsOrderAttributeFromServerDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOrderWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Order attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("order", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("order", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("order", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsDescriptionAttributeFromServerDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Description attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("description", "char_string", "char_string"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputVoltageAttribueFromServerDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedInputVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedInputVoltage", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredAssessedInputVoltage", [value unsignedIntValue], 0UL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint32_t>("wiredAssessedInputVoltage", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputFrequencyAttributeFromServerDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedInputFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedInputFrequency", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("wiredAssessedInputFrequency", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("wiredAssessedInputFrequency", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredCurrentTypeAttributeFromServerDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredCurrentTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredCurrentType attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredCurrentType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("wiredCurrentType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("wiredCurrentType", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedCurrentAttributeFromServerDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedCurrent attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedCurrent", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredAssessedCurrent", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredAssessedCurrent", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredNominalVoltageFromServerDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredNominalVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredNominalVoltage from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredNominalVoltage", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredNominalVoltage", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredNominalVoltage", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredMaximumCurrentFromServerDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredMaximumCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredMaximumCurrent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredMaximumCurrent", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredMaximumCurrent", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredMaximumCurrent", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredPresentFromServerDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredPresent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredPresent", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveWiredFaultsFromServerDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveWiredFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads ActiveWiredFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeWiredFaults", "list", "list"));
            VerifyOrReturn(CheckConstraintMaxLength("activeWiredFaults", value, 8));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatVoltageFromServerDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatVoltage from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batVoltage", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batVoltage", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batVoltage", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatPercentRemainingFromServerDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPercentRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatPercentRemaining from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batPercentRemaining", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batPercentRemaining", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batPercentRemaining", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatTimeRemainingFromServerDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatTimeRemaining from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batTimeRemaining", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batTimeRemaining", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batTimeRemaining", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargeLevelFromServerDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargeLevel from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batChargeLevel", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batChargeLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batChargeLevel", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplacementNeededFromServerDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplacementNeededWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplacementNeeded from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplacementNeeded", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplaceabilityFromServerDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplaceabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplaceability from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplaceability", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batReplaceability", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batReplaceability", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatPresentFromServerDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatPresent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batPresent", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveBatFaultsFromServerDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client readsActiveBatFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeBatFaults", "list", "list"));
            VerifyOrReturn(CheckConstraintMaxLength("activeBatFaults", value, 8));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplacementDescriptionFromServerDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplacementDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplacementDescription from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplacementDescription", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batReplacementDescription", value, 60));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatCommonDesignationFromServerDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCommonDesignationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatCommonDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batCommonDesignation", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batCommonDesignation", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batCommonDesignation", [value unsignedIntValue], 80UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatANSIDesignationFromServerDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatANSIDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatANSIDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batANSIDesignation", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batANSIDesignation", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatIECDesignationFromServerDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatIECDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatIECDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batIECDesignation", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batIECDesignation", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatApprovedChemistryFromServerDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatApprovedChemistryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatApprovedChemistry from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batApprovedChemistry", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batApprovedChemistry", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batApprovedChemistry", [value unsignedIntValue], 32UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatCapacityFromServerDut_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatCapacity from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batCapacity", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batCapacity", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batCapacity", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatQuantityFromServerDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatQuantityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatQuantity from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batQuantity", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batQuantity", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batQuantity", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargeStateFromServerDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargeState from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batChargeState", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batChargeState", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batChargeState", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatTimeToFullChargeFromServerDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeToFullChargeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatTimeToFullCharge from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batTimeToFullCharge", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batTimeToFullCharge", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batTimeToFullCharge", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatFunctionalWhileChargingFromServerDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatFunctionalWhileChargingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatFunctionalWhileCharging from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batFunctionalWhileCharging", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargingCurrentFromServerDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargingCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargingCurrent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batChargingCurrent", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batChargingCurrent", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batChargingCurrent", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveBatChargeFaultsFromServerDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatChargeFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads ActiveBatChargeFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeBatChargeFaults", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_1_1()
        : TestCommandBridge("Test_TC_PRS_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !PRS.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given PRS.S.F00(EXT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PRS.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenPrssf00extEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global mandatory attribute: AttributeList\n");
            err = TestReadTheGlobalMandatoryAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(ScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledValueInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(MinScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinScaledValueInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(MaxScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxScaledValueInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(Scale) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaleInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(ScaledTolerance) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledToleranceInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPrssf00extEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PRS.S.F00(EXT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalMandatoryAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global mandatory attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledValueInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinScaledValueInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MinScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValueInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MaxScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaleInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Scale) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledToleranceInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ScaledTolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_2_1()
        : TestCommandBridge("Test_TC_PRS_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute constraints: MeasuredValue\n");
            if (ShouldSkip("PRS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute constraints: MinMeasuredValue\n");
            if (ShouldSkip("PRS.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMinMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute constraints: MaxMeasuredValue\n");
            if (ShouldSkip("PRS.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMaxMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: Tolerance\n");
            if (ShouldSkip("PRS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeTolerance_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute: ScaledValue\n");
            if (ShouldSkip("PRS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute: MinScaledValue\n");
            if (ShouldSkip("PRS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinScaledValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute: MaxScaledValue\n");
            if (ShouldSkip("PRS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxScaledValue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute: ScaledTolerance\n");
            if (ShouldSkip("PRS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledTolerance_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute: Scale\n");
            if (ShouldSkip("PRS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScale_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMeasuredValue_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("measuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("measuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMinMeasuredValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minMeasuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMaxMeasuredValue_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxMeasuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Tolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledValue_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("scaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("scaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("scaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinScaledValue_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minScaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minScaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minScaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValue_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxScaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxScaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxScaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledTolerance_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScaledTolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scaledTolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("scaledTolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("scaledTolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScale_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Scale Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scale", "int8s", "int8s"));
            VerifyOrReturn(CheckConstraintMinValue<int8_t>("scale", [value charValue], -127));
            VerifyOrReturn(CheckConstraintMaxValue<int8_t>("scale", [value charValue], 127));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_2_2()
        : TestCommandBridge("Test_TC_PRS_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads from the DUT the MeasuredValue attribute\n");
            if (ShouldSkip("PRS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheMeasuredValueAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Operate on device to change the pressure significantly\n");
            if (ShouldSkip("PICS_USER_PROMPT && PRS.M.PressureChange")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToChangeThePressureSignificantly_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait 2s\n");
            err = TestWait2s_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : After a few seconds, TH reads from the DUT the MeasuredValue attribute\n");
            if (ShouldSkip("PRS.S.A0000 && PRS.M.PressureChange")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsFromTheDutTheMeasuredValueAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable ValueBeforeChange;

    CHIP_ERROR TestThReadsFromTheDutTheMeasuredValueAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the MeasuredValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                ValueBeforeChange = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToChangeThePressureSignificantly_2()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestWait2s_3()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsFromTheDutTheMeasuredValueAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads from the DUT the MeasuredValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("measuredValue", value, ValueBeforeChange));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_1_1()
        : TestCommandBridge("Test_TC_PCC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0009")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : TH reads optional attribute(Speed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : TH reads optional attribute(Power) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the AcceptedCommandList attribute from the DUT\n");
            err = TestThReadsTheAcceptedCommandListAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads the GeneratedCommandList attribute from the DUT\n");
            err = TestThReadsTheGeneratedCommandListAttributeFromTheDut_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Speed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Power) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_1()
        : TestCommandBridge("Test_TC_PCC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MaxPressure\n");
            if (ShouldSkip("PCC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxPressure_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxSpeed\n");
            if (ShouldSkip("PCC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxSpeed_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MaxFlow\n");
            if (ShouldSkip("PCC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxFlow_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: MinConstPressure\n");
            if (ShouldSkip("PCC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstPressure_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute: MaxConstPressure\n");
            if (ShouldSkip("PCC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstPressure_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute: MinCompPressure\n");
            if (ShouldSkip("PCC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinCompPressure_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute: MaxCompPressure\n");
            if (ShouldSkip("PCC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxCompPressure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute: MinConstSpeed\n");
            if (ShouldSkip("PCC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstSpeed_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute: MaxConstSpeed\n");
            if (ShouldSkip("PCC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstSpeed_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute: MinConstFlow\n");
            if (ShouldSkip("PCC.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstFlow_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute: MaxConstFlow\n");
            if (ShouldSkip("PCC.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstFlow_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute: MinConstTemp\n");
            if (ShouldSkip("PCC.S.A000b")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstTemp_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute: MaxConstTemp\n");
            if (ShouldSkip("PCC.S.A000c")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstTemp_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute: PumpStatus\n");
            if (ShouldSkip("PCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePumpStatus_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read attribute: EffectiveOperationMode\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadAttributeEffectiveOperationMode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadAttributeEffectiveControlMode_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read attribute: Capacity\n");
            if (ShouldSkip("PCC.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadAttributeCapacity_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional attribute: Speed\n");
            if (ShouldSkip("PCC.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSpeed_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the optional attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLifetimeRunningHours_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read the optional attribute: Power\n");
            if (ShouldSkip("PCC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePower_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the optional attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLifetimeEnergyConsumed_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Read optional attribute: OperationMode\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeOperationMode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read optional attribute: ControlMode\n");
            if (ShouldSkip("PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeControlMode_23();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 24;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxPressure_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxSpeed_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxFlow_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstPressure_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minConstPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minConstPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstPressure_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxConstPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxConstPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinCompPressure_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinCompPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minCompPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minCompPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minCompPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxCompPressure_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxCompPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxCompPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxCompPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxCompPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstSpeed_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minConstSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minConstSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstSpeed_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxConstSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxConstSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstFlow_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minConstFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minConstFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstFlow_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxConstFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxConstFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstTemp_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstTemp Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstTemp", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minConstTemp", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minConstTemp", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstTemp_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstTemp Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstTemp", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxConstTemp", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxConstTemp", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePumpStatus_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePumpStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: PumpStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("pumpStatus", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("pumpStatus", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("pumpStatus", [value unsignedShortValue], 8U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEffectiveOperationMode_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: EffectiveOperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("effectiveOperationMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("effectiveOperationMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("effectiveOperationMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEffectiveControlMode_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("effectiveControlMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("effectiveControlMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("effectiveControlMode", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCapacity_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: Capacity Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("capacity", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("capacity", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("capacity", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSpeed_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Speed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("speed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("speed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("speed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLifetimeRunningHours_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lifetimeRunningHours", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("lifetimeRunningHours", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("lifetimeRunningHours", [value unsignedIntValue], 16777215UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePower_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Power Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("power", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("power", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("power", [value unsignedIntValue], 16777215UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLifetimeEnergyConsumed_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lifetimeEnergyConsumed", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("lifetimeEnergyConsumed", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("lifetimeEnergyConsumed", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeOperationMode_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute: OperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeControlMode_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute: ControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("controlMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("controlMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("controlMode", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_2()
        : TestCommandBridge("Test_TC_PCC_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH write 0 (Normal) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite0NormalToTheOperationModeAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH write 1 (Minimum) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestThWrite1MinimumToTheOperationModeAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.A0011 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time.\n");
            if (ShouldSkip("PCC.S.A0020 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestThWrite2MaximumToTheOperationModeAttributeToDutOneAtATime_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.A0011 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH write 3 (Local) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite3LocalToTheOperationModeAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrite0NormalToTheOperationModeAttributeToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 0 (Normal) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite1MinimumToTheOperationModeAttributeToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 1 (Minimum) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite2MaximumToTheOperationModeAttributeToDutOneAtATime_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time. "
                                                     @"Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite3LocalToTheOperationModeAttributeToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 3 (Local) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_3()
        : TestCommandBridge("Test_TC_PCC_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write 0 to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestWrite0ToTheOperationModeAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the attribute: EffectiveOperationMode\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveOperationMode_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write 0 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestWrite0ToTheControlModeAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write 1 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstPressure")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheControlModeAttributeToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstPressure")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write 2 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeCompPressure")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheControlModeAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeCompPressure")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write 3 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstFlow")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheControlModeAttributeToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstFlow")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write 5 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeConstTemp")) {
                NextTest();
                return;
            }
            err = TestWrite5ToTheControlModeAttributeToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstTemp")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Write 7 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0021 && PCC.M.ControlModeAuto")) {
                NextTest();
                return;
            }
            err = TestWrite7ToTheControlModeAttributeToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeAuto")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_14();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 15;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWrite0ToTheOperationModeAttributeToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write 0 to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveOperationMode_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveOperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite0ToTheControlModeAttributeToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 0 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite1ToTheControlModeAttributeToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 1 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheControlModeAttributeToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 2 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheControlModeAttributeToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 3 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite5ToTheControlModeAttributeToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 5 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite7ToTheControlModeAttributeToDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 7 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_4()
        : TestCommandBridge("Test_TC_PCC_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write 1 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheLifetimeRunningHoursAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write 2 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheLifetimeRunningHoursAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write 3 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheLifetimeRunningHoursAttributeToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write 1 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheLifetimeEnergyConsumedAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write 2 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheLifetimeEnergyConsumedAttributeToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write 3 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheLifetimeEnergyConsumedAttributeToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWrite1ToTheLifetimeRunningHoursAttributeToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 1 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 1UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheLifetimeRunningHoursAttributeToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 2 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 2UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheLifetimeRunningHoursAttributeToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 3 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 3UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite1ToTheLifetimeEnergyConsumedAttributeToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 1 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 1UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheLifetimeEnergyConsumedAttributeToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 2 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 2UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheLifetimeEnergyConsumedAttributeToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 3 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 3UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PSCFG_1_1()
        : TestCommandBridge("Test_TC_PSCFG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PSCFG_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PSCFG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PSCFG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Commission DUT to TH\n");
            err = TestCommissionDutToTh_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the AcceptedCommandList attribute from the DUT\n");
            err = TestThReadsTheAcceptedCommandListAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the GeneratedCommandList attribute from the DUT\n");
            err = TestThReadsTheGeneratedCommandListAttributeFromTheDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestCommissionDutToTh_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PSCFG_2_1()
        : TestCommandBridge("Test_TC_PSCFG_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PSCFG_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PSCFG_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PSCFG_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Commission DUT to TH\n");
            err = TestCommissionDutToTh_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the Sources attribute from the DUT\n");
            if (ShouldSkip("PSCFG.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSourcesAttributeFromTheDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestCommissionDutToTh_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSourcesAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSourcesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Sources attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("sources", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_RH_1_1()
        : TestCommandBridge("Test_TC_RH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_RH_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_RH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_RH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read ClusterRevision attribute from the DUT\n");
            err = TestReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("RH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_RH_2_1()
        : TestCommandBridge("Test_TC_RH_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_RH_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_RH_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_RH_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the MinMeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMinMeasuredValueAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the MaxMeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMaxMeasuredValueAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the MeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMeasuredValueAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the Tolerance attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTheToleranceAttributeFromTheDut_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheMinMeasuredValueAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MinMeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMaxMeasuredValueAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MaxMeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMeasuredValueAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheToleranceAttributeFromTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Tolerance attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_SWTCH_1_1()
        : TestCommandBridge("Test_TC_SWTCH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_SWTCH_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_SWTCH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_SWTCH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : Read FeatureMap  attribute and Check values of flags in this FeatureMap\n");
            if (ShouldSkip("!SWTCH.S.F00 && !SWTCH.S.F01 && !SWTCH.S.F02 && !SWTCH.S.F03 && !SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadFeatureMapAttributeAndCheckValuesOfFlagsInThisFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf00lsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf01msEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf02msrEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf03mslEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf04msmEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: AttributeList\n");
            if (ShouldSkip("SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the global attribute: AttributeList\n");
            if (ShouldSkip("!SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeAndCheckValuesOfFlagsInThisFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap  attribute and Check values of flags in this FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf00lsEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf01msEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf02msrEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf03mslEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf04msmEnsureFeaturemapHasTheCorrectBitSet_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TMP_1_1()
        : TestCommandBridge("Test_TC_TMP_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TMP_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TMP_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TMP_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read ClusterRevision attribute from the DUT\n");
            err = TestReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("TMP.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read AcceptedCommandList attribute from the DUT\n");
            err = TestReadAcceptedCommandListAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read GeneratedCommandList attribute from the DUT\n");
            err = TestReadGeneratedCommandListAttributeFromTheDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListAttributeFromTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGeneratedCommandListAttributeFromTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TMP_2_1()
        : TestCommandBridge("Test_TC_TMP_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TMP_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TMP_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TMP_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MinMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMinMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MeasuredValue\n");
            if (ShouldSkip("TMP.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: Tolerance\n");
            if (ShouldSkip("TMP.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeTolerance_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minMeasuredValue", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxMeasuredValue", [value shortValue], -27314));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("measuredValue", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("measuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Tolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSTAT_1_1()
        : TestCommandBridge("Test_TC_TSTAT_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSTAT_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSTAT_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSTAT_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("!TSTAT.S.F00 && !TSTAT.S.F01 && !TSTAT.S.F02 && !TSTAT.S.F03 && !TSTAT.S.F04 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf00heatEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf01coolEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf02occEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf03schEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf04sbEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf05autoEnsureFeaturemapHasTheCorrectBitSet_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF00HEATTstatsf02occAttributeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF01COOLTstatsf02occAttributeInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F04 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF04SBTstatsf02occAttributeInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf00heatEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf01coolEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf02occEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf03schEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf04sbEnsureFeaturemapHasTheCorrectBitSet_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf05autoEnsureFeaturemapHasTheCorrectBitSet_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATTstatsf02occAttributeInAttributeList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLTstatsf02occAttributeInAttributeList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 52UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 53UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 54UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBTstatsf02occAttributeInAttributeList_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 55UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 56UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 57UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_1_1()
        : TestCommandBridge("Test_TC_TSUIC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH read ClusterRevision attribute from the DUT\n");
            err = TestThReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_2_1()
        : TestCommandBridge("Test_TC_TSUIC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: TemperatureDisplayMode\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeTemperatureDisplayMode_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: KeypadLockout\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeKeypadLockout_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the optional attribute: ScheduleProgrammingVisibility\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScheduleProgrammingVisibility_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeTemperatureDisplayMode_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: TemperatureDisplayMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("temperatureDisplayMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("temperatureDisplayMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("temperatureDisplayMode", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeKeypadLockout_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: KeypadLockout Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("keypadLockout", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("keypadLockout", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("keypadLockout", [value unsignedCharValue], 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScheduleProgrammingVisibility_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScheduleProgrammingVisibility Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scheduleProgrammingVisibility", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("scheduleProgrammingVisibility", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("scheduleProgrammingVisibility", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_2_2()
        : TestCommandBridge("Test_TC_TSUIC_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Writes a value of 0 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToTemperatureDisplayModeAttributeOfDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify device temperature displayed in °C\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceTemperatureDisplayedInc_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Writes a value of 1 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToTemperatureDisplayModeAttributeOfDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Verify device temperature displayed in °F\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceTemperatureDisplayedInf_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Writes a value of greater than 1 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Writes a value of 0 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify all device functionality available to the user\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyAllDeviceFunctionalityAvailableToTheUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Writes a value of 1 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Verify device operates at Level 1 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel1ReducedFunctionality_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Writes a value of 2 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Verify device operates at Level 2 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel2ReducedFunctionality_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Writes a value of 3 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Verify device operates at Level 3 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel3ReducedFunctionality_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Writes a value of 4 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Verify device operates at Level 4 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel4ReducedFunctionality_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Writes a value of 5 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Verify device operates at least functionality level\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLeastFunctionalityLevel_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Writes a value of greater than 5 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : Writes a value of 0 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : Verify local schedule programming functionality is enabled at the thermostat\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestVerifyLocalScheduleProgrammingFunctionalityIsEnabledAtTheThermostat_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_31();
            break;
        case 32:
            ChipLogProgress(
                chipTool, " ***** Test Step 32 : Writes a value of 1 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : Verify local schedule programming functionality is disabled at the thermostat\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestVerifyLocalScheduleProgrammingFunctionalityIsDisabledAtTheThermostat_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_34();
            break;
        case 35:
            ChipLogProgress(chipTool,
                " ***** Test Step 35 : Writes a value of greater than 1 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_36();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 37;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWritesAValueOf0ToTemperatureDisplayModeAttributeOfDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(
                                                       @"Writes a value of 0 to TemperatureDisplayMode attribute of DUT Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInc_2()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToTemperatureDisplayModeAttributeOfDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(
                                                       @"Writes a value of 1 to TemperatureDisplayMode attribute of DUT Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInf_5()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("temperature display mode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                                    completion:^(NSError * _Nullable err) {
                                                        NSLog(@"Writes a value of greater than 1 to TemperatureDisplayMode "
                                                              @"attribute of DUT Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status",
                                                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                    ? err.code
                                                                    : EMBER_ZCL_STATUS_FAILURE)
                                                                : 0,
                                                            EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("temperature display mode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 0 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyAllDeviceFunctionalityAvailableToTheUser_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 1 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel1ReducedFunctionality_13()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 2 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel2ReducedFunctionality_16()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 3 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel3ReducedFunctionality_19()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 4 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel4ReducedFunctionality_22()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 5 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLeastFunctionalityLevel_25()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:6U];
        [cluster
            writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes a value of greater than 5 to KeypadLockout attribute of DUT Error: %@", err);

                                          VerifyOrReturn(CheckValue("status",
                                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                      ? err.code
                                                      : EMBER_ZCL_STATUS_FAILURE)
                                                  : 0,
                                              EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("keypad lockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of 0 to ScheduleProgrammingVisibility "
                                                                     @"attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsEnabledAtTheThermostat_30()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("schedule programming visibility", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of 1 to ScheduleProgrammingVisibility "
                                                                     @"attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsDisabledAtTheThermostat_33()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("schedule programming visibility", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of greater than 1 to "
                                                                     @"ScheduleProgrammingVisibility attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("schedule programming visibility", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGTHREAD_1_1()
        : TestCommandBridge("Test_TC_DGTHREAD_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGTHREAD_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGTHREAD_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGTHREAD_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGTHREAD.S.F00 && !DGTHREAD.S.F01 && !DGTHREAD.S.F02 && !DGTHREAD.S.F03 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf00pktcntEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf01errcntEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf02mlecntEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf03maccntEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads mandatory attributes in AttributeList from DUT\n");
            err = TestThReadsMandatoryAttributesInAttributeListFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList\n");
            if (ShouldSkip("DGTHREAD.C.A0006 && DGTHREAD.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeDGTHREADSF01ERRCNTInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute (DetachedRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A000e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeDetachedRoleCountInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads optional attribute (ChildRoleCount) AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeChildRoleCountAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads optional attribute (RouterRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRouterRoleCountInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads optional attribute (LeaderRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLeaderRoleCountInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads optional attribute (AttachAttemptCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeAttachAttemptCountInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : TH reads optional attribute (PartitionIdChangeCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0013")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePartitionIdChangeCountInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH reads optional attribute (BetterPartitionAttachAttemptCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeBetterPartitionAttachAttemptCountInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads optional attribute (ParentChangeCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeParentChangeCountInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads optional attribute (TxTotalCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxTotalCountInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads optional attribute (TxUnicastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxUnicastCountInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads optional attribute (TxBroadcastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0018")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBroadcastCountInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads optional attribute (TxAckRequestedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0019")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxAckRequestedCountInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads optional attribute (TxAckedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxAckedCountInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : TH reads optional attribute (TxNoAckRequestedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxNoAckRequestedCountInAttributeList_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads optional attributes (TxDataCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributesTxDataCountInAttributeList_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads optional attribute (TxDataPollCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxDataPollCountInAttributeList_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads optional attribute (TxBeaconCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBeaconCountInAttributeList_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : TH reads optional attribute (TxBeaconRequestCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBeaconRequestCountInAttributeList_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads optional attribute (TxOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxOtherCountInAttributeList_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads optional attribute (TxRetryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxRetryCountInAttributeList_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : TH reads optional attribute (TxDirectMaxRetryExpiryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0022")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxDirectMaxRetryExpiryCountInAttributeList_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : TH reads optional attribute (TxIndirectMaxRetryExpiryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxIndirectMaxRetryExpiryCountInAttributeList_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads optional attribute (TxErrCcaCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0024")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrCcaCountInAttributeList_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH reads optional attribute (TxErrAbortCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0025")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrAbortCountInAttributeList_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : TH reads optional attribute (TxErrBusyChannelCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0026")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrBusyChannelCountInAttributeList_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads optional attribute (RxTotalCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0027")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxTotalCountInAttributeList_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads optional attribute (RxUnicastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0028")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxUnicastCountInAttributeList_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads optional attribute (RxBroadcastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0029")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBroadcastCountInAttributeList_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH reads optional attribute (RxDataCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDataCountInAttributeList_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads optional attribute (RxDataPollCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDataPollCountInAttributeList_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH reads optional attribute (RxBeaconCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBeaconCountInAttributeList_39();
            break;
        case 40:
            ChipLogProgress(
                chipTool, " ***** Test Step 40 : TH reads optional attribute (RxBeaconRequestCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBeaconRequestCountInAttributeList_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH reads optional attribute (RxOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxOtherCountInAttributeList_41();
            break;
        case 42:
            ChipLogProgress(
                chipTool, " ***** Test Step 42 : TH reads optional attribute (RxAddressFilteredCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxAddressFilteredCountInAttributeList_42();
            break;
        case 43:
            ChipLogProgress(
                chipTool, " ***** Test Step 43 : TH reads optional attribute (RxDestAddrFilteredCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDestAddrFilteredCountInAttributeList_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH reads optional attribute (RxDuplicatedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDuplicatedCountInAttributeList_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : TH reads optional attribute (RxErrNoFrameCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0032")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrNoFrameCountInAttributeList_45();
            break;
        case 46:
            ChipLogProgress(
                chipTool, " ***** Test Step 46 : TH reads optional attribute (RxErrUnknownNeighborCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrUnknownNeighborCountInAttributeList_46();
            break;
        case 47:
            ChipLogProgress(
                chipTool, " ***** Test Step 47 : TH reads optional attribute (RxErrInvalidScrAddrCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0034")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrInvalidScrAddrCountInAttributeList_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : TH reads optional attribute (RxErrSecCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0035")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrSecCountInAttributeList_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : TH reads optional attribute (RxErrFcsCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0036")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrFcsCountInAttributeList_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : TH reads optional attribute (RxErrOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0037")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrOtherCountInAttributeList_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read the optional attribute (ActiveTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0039")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeActiveTimestampInAttributeList_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Read the optional attribute (PendingTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A003A")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePendingTimestampInAttributeList_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read the optional attribute (Delay) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A003B")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDelayInAttributeList_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_55();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 56;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf00pktcntEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf01errcntEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf02mlecntEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf03maccntEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMandatoryAttributesInAttributeListFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads mandatory attributes in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 59UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 60UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 61UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 62UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeDGTHREADSF01ERRCNTInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeDetachedRoleCountInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (DetachedRoleCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeChildRoleCountAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (ChildRoleCount) AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRouterRoleCountInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RouterRoleCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLeaderRoleCountInAttributeList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (LeaderRoleCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeAttachAttemptCountInAttributeList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (AttachAttemptCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePartitionIdChangeCountInAttributeList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (PartitionIdChangeCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeBetterPartitionAttachAttemptCountInAttributeList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (BetterPartitionAttachAttemptCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeParentChangeCountInAttributeList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (ParentChangeCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxTotalCountInAttributeList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxTotalCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxUnicastCountInAttributeList_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxUnicastCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxBroadcastCountInAttributeList_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxBroadcastCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 24UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxAckRequestedCountInAttributeList_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxAckRequestedCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxAckedCountInAttributeList_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxAckedCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxNoAckRequestedCountInAttributeList_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxNoAckRequestedCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributesTxDataCountInAttributeList_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attributes (TxDataCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxDataPollCountInAttributeList_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxDataPollCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 29UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxBeaconCountInAttributeList_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxBeaconCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 30UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxBeaconRequestCountInAttributeList_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxBeaconRequestCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 31UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxOtherCountInAttributeList_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxOtherCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxRetryCountInAttributeList_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxRetryCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxDirectMaxRetryExpiryCountInAttributeList_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxDirectMaxRetryExpiryCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxIndirectMaxRetryExpiryCountInAttributeList_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxIndirectMaxRetryExpiryCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 35UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxErrCcaCountInAttributeList_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxErrCcaCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 36UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxErrAbortCountInAttributeList_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxErrAbortCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 37UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxErrBusyChannelCountInAttributeList_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (TxErrBusyChannelCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 38UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxTotalCountInAttributeList_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxTotalCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 39UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxUnicastCountInAttributeList_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxUnicastCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 40UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxBroadcastCountInAttributeList_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxBroadcastCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 41UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDataCountInAttributeList_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxDataCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 42UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDataPollCountInAttributeList_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxDataPollCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 43UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxBeaconCountInAttributeList_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxBeaconCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 44UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxBeaconRequestCountInAttributeList_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxBeaconRequestCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 45UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxOtherCountInAttributeList_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxOtherCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 46UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxAddressFilteredCountInAttributeList_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxAddressFilteredCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 47UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDestAddrFilteredCountInAttributeList_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxDestAddrFilteredCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 48UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDuplicatedCountInAttributeList_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxDuplicatedCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 49UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrNoFrameCountInAttributeList_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrNoFrameCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 50UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrUnknownNeighborCountInAttributeList_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrUnknownNeighborCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 51UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrInvalidScrAddrCountInAttributeList_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrInvalidScrAddrCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 52UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrSecCountInAttributeList_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrSecCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 53UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrFcsCountInAttributeList_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrFcsCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 54UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrOtherCountInAttributeList_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (RxErrOtherCount) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 55UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeActiveTimestampInAttributeList_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (ActiveTimestamp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 56UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePendingTimestampInAttributeList_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (PendingTimestamp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 57UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDelayInAttributeList_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (Delay) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 58UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThreadNetworkDiagnostics * cluster =
            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_1_1()
        : TestCommandBridge("Test_TC_ULABEL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_1()
        : TestCommandBridge("Test_TC_ULABEL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("labelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_2()
        : TestCommandBridge("Test_TC_ULABEL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute from the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads LabelList attribute from the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeFromTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"roomName";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"master bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"Orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"east";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"2";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"roomType";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"bedroom";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute from the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"roomName"));
                VerifyOrReturn(
                    CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"master bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"Orientation"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"east"));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"2"));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"roomType"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"bedroom"));
            }

            VerifyOrReturn(CheckConstraintType("labelList", "list", "list"));
            VerifyOrReturn(CheckConstraintMinLength("labelList", value, 4));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_3()
        : TestCommandBridge("Test_TC_ULABEL_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"17_bytesIsTooLongforuserlabelnotexpected";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"17_bytesIsTooLongforuserlabelnotexpected";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"foobar";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_4()
        : TestCommandBridge("Test_TC_ULABEL_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"Orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"east";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"Orientation"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"east"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @""));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_1_1()
        : TestCommandBridge("Test_TC_DGWIFI_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("( !DGWIFI.S.F00 && !DGWIFI.S.F01 )")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGWIFI.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDGWIFISF00PacketCountsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDGWIFISF01ErrorCountsEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF00AttributesInAttributeListFromDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF01AttributesInAttributeListFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentMaxRateInAttributeListFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGWIFI.S.F01 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF01CommandInAcceptedCommandListFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGWIFISF00PacketCountsEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGWIFISF01ErrorCountsEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF00AttributesInAttributeListFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01AttributesInAttributeListFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentMaxRateInAttributeListFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01CommandInAcceptedCommandListFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_2_1()
        : TestCommandBridge("Test_TC_DGWIFI_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads BSSID attribute from DUT\n");
            if (ShouldSkip("DGWIFI.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsBssidAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads SecurityType attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsSecurityTypeAttributeConstraints_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads WiFiVersion attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsWiFiVersionAttributeConstraints_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads ChannelNumber attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsChannelNumberAttributeConstraints_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads RSSI attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsRssiAttributeConstraints_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads BeaconLostCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconLostCountAttributeConstraints_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads BeaconRxCount attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconRxCountAttributeConstraints_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads PacketMulticastRxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastRxCountAttributeConstraints_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads PacketMulticastTxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastTxCountAttributeConstraints_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads PacketUnicastRxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastRxCountAttributeConstraints_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads PacketUnicastTxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastTxCountAttributeConstraints_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads CurrentMaxRate attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000b")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentMaxRateAttributeConstraints_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads OverrunCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000c")) {
                NextTest();
                return;
            }
            err = TestReadsOverrunCountAttributeConstraints_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsBssidAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBssidWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads BSSID attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("bssid", "octet_string", "octet_string"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsSecurityTypeAttributeConstraints_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSecurityTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads SecurityType attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("securityType", "enum8", "enum8"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsWiFiVersionAttributeConstraints_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiFiVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads WiFiVersion attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiFiVersion", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("wiFiVersion", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("wiFiVersion", [value unsignedCharValue], 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsChannelNumberAttributeConstraints_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelNumberWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads ChannelNumber attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("channelNumber", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("channelNumber", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("channelNumber", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsRssiAttributeConstraints_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRssiWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads RSSI attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("rssi", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue<int8_t>("rssi", [value charValue], -120));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("rssi", [value charValue], 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconLostCountAttributeConstraints_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconLostCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconLostCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconRxCountAttributeConstraints_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastRxCountAttributeConstraints_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastTxCountAttributeConstraints_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastRxCountAttributeConstraints_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastTxCountAttributeConstraints_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentMaxRateAttributeConstraints_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentMaxRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentMaxRate attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentMaxRate", "int64u", "int64u"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOverrunCountAttributeConstraints_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads OverrunCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("overrunCount", "int64u", "int64u"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_2_3()
        : TestCommandBridge("Test_TC_DGWIFI_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends ResetCounts command to DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsResetCountsCommandToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads BeaconLostCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconLostCountAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads BeaconRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconRxCountAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads PacketMulticastRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastRxCountAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads PacketMulticastTxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastTxCountAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads PacketUnicastRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastRxCountAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads PacketUnicastTxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastTxCountAttributeFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsResetCountsCommandToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends ResetCounts command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconLostCountAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconLostCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconLostCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconRxCountAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastRxCountAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastTxCountAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastTxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastRxCountAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastTxCountAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastTxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_1_1()
        : TestCommandBridge("Test_TC_WNCV_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads from the DUT the (0xFFFD) ClusterRevision attribute\n");
            if (ShouldSkip("WNCV.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads from the DUT the (0xFFFC) FeatureMap attribute\n");
            if (ShouldSkip(" WNCV.S.Afffc && !WNCV.S.F00 && !WNCV.S.F01 && !WNCV.S.F02 && !WNCV.S.F03 && !WNCV.S.F04 ")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given WNCV.S.F00(LF) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf00lfEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf01tlEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf02paLfEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf03absEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf04paTlEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads from the DUT the (0xFFFB) AttributeList attribute\n");
            if (ShouldSkip("WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute(SafetyStatus) in AttributeList\n");
            if (ShouldSkip("WNCV.S.Afffb && WNCV.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSafetyStatusInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in "
                "AttributeList\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.F03 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF00Wncvsf02Wncvsf03AttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF00Wncvsf02AttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in "
                "AttributeList\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.F03 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF01Wncvsf04Wncvsf03AttributeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF01Wncvsf04AttributeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F00 && WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF00Wncvsf02CommandInAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F03")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF01Wncvsf03CommandInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF01Wncvsf04CommandInAcceptedCommandList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_18();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 19;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFD) ClusterRevision attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("clusterRevision", [value unsignedShortValue], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("clusterRevision", [value unsignedShortValue], 200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFC) FeatureMap attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf00lfEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F00(LF) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf01tlEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf02paLfEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf03absEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf04paTlEnsureFeaturemapHasTheCorrectBitSet_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFB) AttributeList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSafetyStatusInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SafetyStatus) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02Wncvsf03AttributeInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02AttributeInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04Wncvsf03AttributeInAttributeList_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04AttributeInAttributeList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF00Wncvsf02CommandInAcceptedCommandList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf03CommandInAcceptedCommandList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf04CommandInAcceptedCommandList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_1()
        : TestCommandBridge("Test_TC_WNCV_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 1a: read the RO mandatory attribute default: Type\n");
            if (ShouldSkip("WNCV.S.A0000")) {
                NextTest();
                return;
            }
            err = Test1aReadTheRoMandatoryAttributeDefaultType_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: read the RO mandatory attribute default: ConfigStatus\n");
            if (ShouldSkip("WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1bReadTheRoMandatoryAttributeDefaultConfigStatus_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1c: read the RO mandatory attribute default: OperationalStatus\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: read the RO mandatory attribute default: EndProductType\n");
            if (ShouldSkip("WNCV.S.A000d")) {
                NextTest();
                return;
            }
            err = Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1e: read the RW mandatory attribute default: Mode\n");
            if (ShouldSkip("WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1eReadTheRwMandatoryAttributeDefaultMode_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 1f: write a value into the RW mandatory attribute:: Mode\n");
            if (ShouldSkip("WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1fWriteAValueIntoTheRwMandatoryAttributeMode_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : 2a: read the RO optional attribute default: TargetPositionLiftPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2aReadTheRoOptionalAttributeDefaultTargetPositionLiftPercent100ths_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 2b: read the RO optional attribute default: TargetPositionTiltPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2bReadTheRoOptionalAttributeDefaultTargetPositionTiltPercent100ths_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test2cReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercent100ths_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : 2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test2dReadTheRoOptionalAttributeDefaultCurrentPositionTiltPercent100ths_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 2e: read the RO optional attribute default: InstalledOpenLimitLift\n");
            if (ShouldSkip("WNCV.S.A0010")) {
                NextTest();
                return;
            }
            err = Test2eReadTheRoOptionalAttributeDefaultInstalledOpenLimitLift_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2f: read the RO optional attribute default: InstalledClosedLimitLift\n");
            if (ShouldSkip("WNCV.S.A0011")) {
                NextTest();
                return;
            }
            err = Test2fReadTheRoOptionalAttributeDefaultInstalledClosedLimitLift_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2g: read the RO optional attribute default: InstalledOpenLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0012")) {
                NextTest();
                return;
            }
            err = Test2gReadTheRoOptionalAttributeDefaultInstalledOpenLimitTilt_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : 2h: read the RO optional attribute default: InstalledClosedLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0013")) {
                NextTest();
                return;
            }
            err = Test2hReadTheRoOptionalAttributeDefaultInstalledClosedLimitTilt_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3a: read the RO mandatory attribute default: SafetyStatus\n");
            if (ShouldSkip("WNCV.S.A001a")) {
                NextTest();
                return;
            }
            err = Test3aReadTheRoMandatoryAttributeDefaultSafetyStatus_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3b: read the RO optional attribute default: PhysicalClosedLimitLift\n");
            if (ShouldSkip("WNCV.S.A0001")) {
                NextTest();
                return;
            }
            err = Test3bReadTheRoOptionalAttributeDefaultPhysicalClosedLimitLift_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3c: read the RO optional attribute default: PhysicalClosedLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0002")) {
                NextTest();
                return;
            }
            err = Test3cReadTheRoOptionalAttributeDefaultPhysicalClosedLimitTilt_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : 3d: read the RO optional attribute default: CurrentPositionLift\n");
            if (ShouldSkip("WNCV.S.A0003")) {
                NextTest();
                return;
            }
            err = Test3dReadTheRoOptionalAttributeDefaultCurrentPositionLift_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3e: read the RO optional attribute default: CurrentPositionTilt\n");
            if (ShouldSkip("WNCV.S.A0004")) {
                NextTest();
                return;
            }
            err = Test3eReadTheRoOptionalAttributeDefaultCurrentPositionTilt_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : 3f: read the RO optional attribute default: NumberOfActuationsLift\n");
            if (ShouldSkip("WNCV.S.A0005")) {
                NextTest();
                return;
            }
            err = Test3fReadTheRoOptionalAttributeDefaultNumberOfActuationsLift_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : 3g: read the RO optional attribute default: NumberOfActuationsTilt\n");
            if (ShouldSkip("WNCV.S.A0006")) {
                NextTest();
                return;
            }
            err = Test3gReadTheRoOptionalAttributeDefaultNumberOfActuationsTilt_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3h: read the RO optional attribute default: CurrentPositionLiftPercentage\n");
            if (ShouldSkip("WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3hReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercentage_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : 3i:read the RO optional attribute default: CurrentPositionTiltPercentage\n");
            if (ShouldSkip("WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3ireadTheRoOptionalAttributeDefaultCurrentPositionTiltPercentage_23();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 24;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aReadTheRoMandatoryAttributeDefaultType_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1a: read the RO mandatory attribute default: Type Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("type", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("type", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("type", [value unsignedCharValue], 9U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bReadTheRoMandatoryAttributeDefaultConfigStatus_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b: read the RO mandatory attribute default: ConfigStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("configStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1c: read the RO mandatory attribute default: OperationalStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationalStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationalStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: read the RO mandatory attribute default: EndProductType Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("endProductType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("endProductType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("endProductType", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eReadTheRwMandatoryAttributeDefaultMode_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1e: read the RW mandatory attribute default: Mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("mode", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("mode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("mode", [value unsignedCharValue], 15U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fWriteAValueIntoTheRwMandatoryAttributeMode_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1f: write a value into the RW mandatory attribute:: Mode Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aReadTheRoOptionalAttributeDefaultTargetPositionLiftPercent100ths_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2a: read the RO optional attribute default: TargetPositionLiftPercent100ths Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bReadTheRoOptionalAttributeDefaultTargetPositionTiltPercent100ths_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2b: read the RO optional attribute default: TargetPositionTiltPercent100ths Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2cReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercent100ths_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dReadTheRoOptionalAttributeDefaultCurrentPositionTiltPercent100ths_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eReadTheRoOptionalAttributeDefaultInstalledOpenLimitLift_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: read the RO optional attribute default: InstalledOpenLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedOpenLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedOpenLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedOpenLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2fReadTheRoOptionalAttributeDefaultInstalledClosedLimitLift_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2f: read the RO optional attribute default: InstalledClosedLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedClosedLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedClosedLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedClosedLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2gReadTheRoOptionalAttributeDefaultInstalledOpenLimitTilt_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2g: read the RO optional attribute default: InstalledOpenLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedOpenLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedOpenLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedOpenLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2hReadTheRoOptionalAttributeDefaultInstalledClosedLimitTilt_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2h: read the RO optional attribute default: InstalledClosedLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedClosedLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedClosedLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedClosedLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aReadTheRoMandatoryAttributeDefaultSafetyStatus_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSafetyStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: read the RO mandatory attribute default: SafetyStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("safetyStatus", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("safetyStatus", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("safetyStatus", [value unsignedShortValue], 2047U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bReadTheRoOptionalAttributeDefaultPhysicalClosedLimitLift_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: read the RO optional attribute default: PhysicalClosedLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalClosedLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("physicalClosedLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("physicalClosedLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cReadTheRoOptionalAttributeDefaultPhysicalClosedLimitTilt_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: read the RO optional attribute default: PhysicalClosedLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalClosedLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("physicalClosedLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("physicalClosedLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dReadTheRoOptionalAttributeDefaultCurrentPositionLift_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: read the RO optional attribute default: CurrentPositionLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLift", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentPositionLift", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentPositionLift", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eReadTheRoOptionalAttributeDefaultCurrentPositionTilt_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: read the RO optional attribute default: CurrentPositionTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTilt", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentPositionTilt", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentPositionTilt", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fReadTheRoOptionalAttributeDefaultNumberOfActuationsLift_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3f: read the RO optional attribute default: NumberOfActuationsLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("numberOfActuationsLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfActuationsLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfActuationsLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3gReadTheRoOptionalAttributeDefaultNumberOfActuationsTilt_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3g: read the RO optional attribute default: NumberOfActuationsTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("numberOfActuationsTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfActuationsTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfActuationsTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3hReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercentage_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3h: read the RO optional attribute default: CurrentPositionLiftPercentage Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3ireadTheRoOptionalAttributeDefaultCurrentPositionTiltPercentage_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3i:read the RO optional attribute default: CurrentPositionTiltPercentage Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_2()
        : TestCommandBridge("Test_TC_WNCV_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : Reads ConfigStatus attribute from DUT, if (PA & LF) value of bit 3 must be 1b else 0b & if "
                "(PA & TL) value of bit 4 must be 1b else 0b\n");
            if (ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0007 && WNCV.S.F00 && WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadsConfigStatusAttributeFromDutIfPaLfValueOfBit3MustBe1bElse0bIfPaTlValueOfBit4MustBe1bElse0b_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsConfigStatusAttributeFromDutIfPaLfValueOfBit3MustBe1bElse0bIfPaTlValueOfBit4MustBe1bElse0b_1()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_WNCV_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_3()
        : TestCommandBridge("Test_TC_WNCV_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 1a: TH set the Mode Attribute bit0 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1aThSetTheModeAttributeBit0OfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1bThReadsConfigStatusAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1c: TH clear the Mode Attribute bit0 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1cThClearTheModeAttributeBit0OfTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1dThReadsConfigStatusAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2a: TH set the Mode Attribute bit1 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2aThSetTheModeAttributeBit1OfTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 2b: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test2bThReadsConfigStatusAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : 2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2cIfConfigStatusBit00ThSendDownOrCloseCommandToTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2d: TH clear the Mode Attribute bit1 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2dThClearTheModeAttributeBit1OfTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2e: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test2eThReadsConfigStatusAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2f: TH reads the Mode Attribute from the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2fThReadsTheModeAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 2g: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2gThSendDownOrCloseCommandToTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 3a: TH set the Mode Attribute bit2 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test3aThSetTheModeAttributeBit2OfTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 3b: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test3bThSendDownOrCloseCommandToTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3c: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test3cThReadsConfigStatusAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3d: TH clear the Mode Attribute bit2 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test3dThClearTheModeAttributeBit2OfTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : 3e: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test3eThSendDownOrCloseCommandToTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : 3f: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test3fThReadsConfigStatusAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_BUSY));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSetTheModeAttributeBit0OfTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1a: TH set the Mode Attribute bit0 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThReadsConfigStatusAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1cThClearTheModeAttributeBit0OfTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1c: TH clear the Mode Attribute bit0 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThReadsConfigStatusAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSetTheModeAttributeBit1OfTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"2a: TH set the Mode Attribute bit1 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull configStatusValA;

    CHIP_ERROR Test2bThReadsConfigStatusAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2b: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));
            {
                configStatusValA = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2cIfConfigStatusBit00ThSendDownOrCloseCommandToTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThClearTheModeAttributeBit1OfTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"2d: TH clear the Mode Attribute bit1 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThReadsConfigStatusAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2fThReadsTheModeAttributeFromTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2f: TH reads the Mode Attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("mode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("mode", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2gThSendDownOrCloseCommandToTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2g: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetTheModeAttributeBit2OfTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"3a: TH set the Mode Attribute bit2 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bThSendDownOrCloseCommandToTheDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"3b: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_BUSY));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull configStatusValB;

    CHIP_ERROR Test3cThReadsConfigStatusAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));
            {
                configStatusValB = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dThClearTheModeAttributeBit2OfTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"3d: TH clear the Mode Attribute bit2 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eThSendDownOrCloseCommandToTheDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"3e: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fThReadsConfigStatusAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3f: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_4()
        : TestCommandBridge("Test_TC_WNCV_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads Type attribute from DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTypeAttributeFromDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTypeAttributeFromDut_1()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_WNCV_2_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_5()
        : TestCommandBridge("Test_TC_WNCV_2_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads EndProductType attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000d")) {
                NextTest();
                return;
            }
            err = TestThReadsEndProductTypeAttributeFromDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsEndProductTypeAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EndProductType attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("endProductType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("endProductType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("endProductType", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_1()
        : TestCommandBridge("Test_TC_WNCV_3_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 10 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor10SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : 1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : 1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : 1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends UpOrOpen command to DUT\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsUpOrOpenCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH leave the device moving for 2 seconds\n");
            err = Test2eThLeaveTheDeviceMovingFor2Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3a: TH reads OperationalStatus attribute's bit 0..1\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit01_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : 3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : 5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : 5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 30;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_1_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_1_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_1_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_1_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_1_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends UpOrOpen command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 0..1 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"4a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_2()
        : TestCommandBridge("Test_TC_WNCV_3_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 10 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor10SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : 1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : 1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : 1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends DownOrClose command to DUT\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsDownOrCloseCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH leave the device moving for 2 seconds\n");
            err = Test2eThLeaveTheDeviceMovingFor2Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3a: TH reads OperationalStatus attribute's bit 0..1\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit01_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : 3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : 5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : 5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 30;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_2_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_2_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_2_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_2_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_2_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends DownOrClose command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 0..1 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"4a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_3()
        : TestCommandBridge("Test_TC_WNCV_3_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 6-8 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor68SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1cThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: TH Waits for 2 seconds movement(s) on the device\n");
            err = Test1dThWaitsFor2SecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1e: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test1eThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 1d: TH Waits for 2 seconds movement(s) on the device\n");
            err = Test1dThWaitsFor2SecondsMovementsOnTheDevice_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsAStopMotionCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : 2b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: TH reads OperationalStatus attribute from DUT after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDutAfterAStopMotion_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 2d: TH waits for 100ms - 3s attributes update on the device\n");
            err = Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2eThReadsOperationalStatusAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : 3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal "
                "with CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsTargetPositionLiftPercent100thsAttribute3cItMustBeEqualWithCurrentPositionLiftPercent100thsFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test4aIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal "
                "with CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000c && WNCV.S.A000f && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor68SecondsMovementsOnTheDevice_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1eThReadsOperationalStatusAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1e: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("operationalStatus", value, 0U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }
    bool testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_3_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_3_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_3_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_3_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_3_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsAStopMotionCommandToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDutAfterAStopMotion_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2eThReadsOperationalStatusAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionLift;

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionLift = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test3bIfPaLfThReadsTargetPositionLiftPercent100thsAttribute3cItMustBeEqualWithCurrentPositionLiftPercent100thsFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal with "
                  @"CurrentPositionLiftPercent100ths from DUT Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (attrCurrentPositionLift == nil) {
                    VerifyOrReturn(CheckValueNull("TargetPositionLiftPercent100ths", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, attrCurrentPositionLift));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionTilt;

    CHIP_ERROR Test4aIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionTilt = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal with "
                  @"CurrentPositionTiltPercent100ths from DUT Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (attrCurrentPositionTilt == nil) {
                    VerifyOrReturn(CheckValueNull("TargetPositionTiltPercent100ths", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, attrCurrentPositionTilt));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_4()
        : TestCommandBridge("Test_TC_WNCV_3_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1b: TH Waits for fastMotionDuration seconds movement(s) on the device\n");
            err = Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2a: TH sends UpOrOpen command to DUT\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsUpOrOpenCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : 2b: TH Waits for fullMotionDuration seconds movement(s) on the device\n");
            err = Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2c: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends UpOrOpen command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_5()
        : TestCommandBridge("Test_TC_WNCV_3_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1b: TH Waits for fastMotionDuration seconds movement(s) on the device\n");
            err = Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2a: TH sends DownOrClose command to DUT\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsDownOrCloseCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : 2b: TH Waits for fullMotionDuration seconds movement(s) on the device\n");
            err = Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2c: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends DownOrClose command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_1()
        : TestCommandBridge("Test_TC_WNCV_4_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH waits for x seconds movement(s) on the DUT\n");
            err = Test1bThWaitsForXSecondsMovementsOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 2a: TH sends GoToLiftPercentage command with 25 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsGoToLiftPercentageCommandWith25PercentToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 3a: TH set a timeout of X minutes for failure\n");
            err = Test3aThSetATimeoutOfXMinutesForFailure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 3b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3bThReadsOperationalStatusAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : 3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToLiftPercentageCommandWith7520PercentToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 4b: DUT updates its attributes\n");
            err = Test4bDutUpdatesItsAttributes_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : 4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test4cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 5a: TH waits for x seconds movement(s) on the DUT\n");
            err = Test5aThWaitsForXSecondsMovementsOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 5b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test5bThReadsOperationalStatusAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test5cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test5dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionLiftPercent100ths", value, 0U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsGoToLiftPercentageCommandWith25PercentToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:2500U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2a: TH sends GoToLiftPercentage command with 25 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 2500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 2500U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 25U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith7520PercentToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:7520U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 7520U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 7520U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 75U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_2()
        : TestCommandBridge("Test_TC_WNCV_4_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH waits for x seconds movement(s) on the DUT\n");
            err = Test1bThWaitsForXSecondsMovementsOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 2a: TH sends GoToTiltPercentage command with 30 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsGoToTiltPercentageCommandWith30PercentToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 3a: TH set a timeout of X minutes for failure\n");
            err = Test3aThSetATimeoutOfXMinutesForFailure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 3b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3bThReadsOperationalStatusAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToTiltPercentageCommandWith6005PercentToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 4b: DUT updates its attributes\n");
            err = Test4bDutUpdatesItsAttributes_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : 4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test4cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 5a: TH waits for x seconds movement(s) on the DUT\n");
            err = Test5aThWaitsForXSecondsMovementsOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 5b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test5bThReadsOperationalStatusAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test5dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mFullMotionDuration;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionTiltPercent100ths", value, 0U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsGoToTiltPercentageCommandWith30PercentToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:3000U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2a: TH sends GoToTiltPercentage command with 30 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 3000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 3000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 30U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith6005PercentToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:6005U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 6005U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 6005U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 60U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_3()
        : TestCommandBridge("Test_TC_WNCV_4_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1aIfPaLfLfThReadsCurrentPositionLiftPercent100thsFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : 1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                "CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1b1cIfPaLfLfThReadsCurrentPositionLiftPercentageFromDutAssertCurrentPositionLiftPercent100ths100EqualsCurrentPositionLiftPercentage_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2b: TH sends GoToLiftPercentage command with BadParam to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test2bThSendsGoToLiftPercentageCommandWithBadParamToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 3a: TH sends GoToLiftPercentage command with 10001 to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test3aThSendsGoToLiftPercentageCommandWith10001ToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToLiftPercentageCommandWith0xFFFFToDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionLiftPercent100ths;

    CHIP_ERROR Test1aIfPaLfLfThReadsCurrentPositionLiftPercent100thsFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionLiftPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test1b1cIfPaLfLfThReadsCurrentPositionLiftPercentageFromDutAssertCurrentPositionLiftPercent100ths100EqualsCurrentPositionLiftPercentage_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                  @"CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue,
                    [attrCurrentPositionLiftPercent100ths unsignedShortValue] / 100U));
            }
            if (value != nil) {

                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThSendsGoToLiftPercentageCommandWithBadParamToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2b: TH sends GoToLiftPercentage command with BadParam to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSendsGoToLiftPercentageCommandWith10001ToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"3a: TH sends GoToLiftPercentage command with 10001 to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith0xFFFFToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_4()
        : TestCommandBridge("Test_TC_WNCV_4_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1aIfPaTlTlThReadsCurrentPositionTiltPercent100thsFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : 1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                "CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1b1cIfPaLfLfThReadsCurrentPositionTiltPercentageFromDutAssertCurrentPositionTiltPercent100ths100EqualsCurrentPositionTiltPercentage_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2b: TH sends GoToTiltPercentage command with BadParam to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2bThSendsGoToTiltPercentageCommandWithBadParamToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 3a: TH sends GoToTiltPercentage command with 10001 to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test3aThSendsGoToTiltPercentageCommandWith10001ToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToTiltPercentageCommandWith0xFFFFToDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionTiltPercent100ths;

    CHIP_ERROR Test1aIfPaTlTlThReadsCurrentPositionTiltPercent100thsFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionTiltPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test1b1cIfPaLfLfThReadsCurrentPositionTiltPercentageFromDutAssertCurrentPositionTiltPercent100ths100EqualsCurrentPositionTiltPercentage_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                  @"CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue,
                    [attrCurrentPositionTiltPercent100ths unsignedShortValue] / 100U));
            }
            if (value != nil) {

                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThSendsGoToTiltPercentageCommandWithBadParamToDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2b: TH sends GoToTiltPercentage command with BadParam to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSendsGoToTiltPercentageCommandWith10001ToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"3a: TH sends GoToTiltPercentage command with 10001 to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith0xFFFFToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_5()
        : TestCommandBridge("Test_TC_WNCV_4_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0a: Wait for the commissioned device to be retrieved\n");
            err = Test0aWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 0b: TH sends UpOrOpen command to preposition the DUT\n");
            err = Test0bThSendsUpOrOpenCommandToPrepositionTheDut_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aIfPaLfLfThSendsGoToLiftPercentageCommandWith90ToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1b: TH Waits for 100ms-1s\n");
            err = Test1bThWaitsFor100ms1s_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1c: TH sends StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test1cThSendsStopMotionCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1d: TH Waits for 100ms-1s\n");
            err = Test1dThWaitsFor100ms1s_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aIfPaTlTlThSendsGoToTiltPercentageCommandWith90ToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 2b: TH Waits for 100ms-1s\n");
            err = Test2bThWaitsFor100ms1s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2c: TH sends StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test2cThSendsStopMotionCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2d: TH Waits for 100ms-1s\n");
            err = Test2dThWaitsFor100ms1s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 3a: TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aThReadsCurrentPositionLiftPercent100thsFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 3b: TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3bThReadsCurrentPositionTiltPercent100thsFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 3c: reboot/restart the DUT\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = Test3cRebootRestartTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3d: Wait for the commissioned device to be retrieved\n");
            err = Test3dWaitForTheCommissionedDeviceToBeRetrieved_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3e: TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3eThReadsCurrentPositionLiftPercent100thsFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : 3f: TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3fThReadsCurrentPositionTiltPercent100thsFromDut_16();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 17;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR Test0aWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test0bThSendsUpOrOpenCommandToPrepositionTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"0b: TH sends UpOrOpen command to preposition the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1aIfPaLfLfThSendsGoToLiftPercentageCommandWith90ToDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster
            goToLiftPercentageWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor100ms1s_3()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cThSendsStopMotionCommandToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1c: TH sends StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor100ms1s_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 500UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aIfPaTlTlThSendsGoToTiltPercentageCommandWith90ToDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster
            goToTiltPercentageWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsFor100ms1s_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThSendsStopMotionCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2c: TH sends StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThWaitsFor100ms1s_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 500UL;
        return WaitForMs("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionLiftPercent100ths;

    CHIP_ERROR Test3aThReadsCurrentPositionLiftPercent100thsFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionLiftPercent100ths", value, 0U));
                {
                    attrCurrentPositionLiftPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionTiltPercent100ths;

    CHIP_ERROR Test3bThReadsCurrentPositionTiltPercent100thsFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionTiltPercent100ths", value, 0U));
                {
                    attrCurrentPositionTiltPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cRebootRestartTheDut_12()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_13()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR Test3dWaitForTheCommissionedDeviceToBeRetrieved_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test3eThReadsCurrentPositionLiftPercent100thsFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3e: TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    if (attrCurrentPositionLiftPercent100ths == nil) {
                        VerifyOrReturn(CheckValueNull("CurrentPositionLiftPercent100ths", actualValue));
                    } else {
                        VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                        VerifyOrReturn(
                            CheckValue("CurrentPositionLiftPercent100ths", actualValue, attrCurrentPositionLiftPercent100ths));
                    }
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fThReadsCurrentPositionTiltPercent100thsFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                           endpointID:@(1)
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3f: TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    if (attrCurrentPositionTiltPercent100ths == nil) {
                        VerifyOrReturn(CheckValueNull("CurrentPositionTiltPercent100ths", actualValue));
                    } else {
                        VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                        VerifyOrReturn(
                            CheckValue("CurrentPositionTiltPercent100ths", actualValue, attrCurrentPositionTiltPercent100ths));
                    }
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class TV_TargetNavigatorCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_TargetNavigatorCluster()
        : TestCommandBridge("TV_TargetNavigatorCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_TargetNavigatorCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_TargetNavigatorCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_TargetNavigatorCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Target Navigator list\n");
            err = TestReadAttributeTargetNavigatorList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute current navigator target\n");
            err = TestReadAttributeCurrentNavigatorTarget_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Navigate Target Request Command\n");
            err = TestNavigateTargetRequestCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeTargetNavigatorList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Target Navigator list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TargetList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("identifier", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[0]).identifier, 1U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[0]).name, @"exampleName"));
                VerifyOrReturn(CheckValue("identifier", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[1]).identifier, 2U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[1]).name, @"exampleName"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentNavigatorTarget_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current navigator target Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentTarget", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestNavigateTargetRequestCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
        params.target = [NSNumber numberWithUnsignedChar:1U];
        params.data = @"1";
        [cluster navigateTargetWithParams:params
                               completion:^(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Navigate Target Request Command Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.status;
                                       VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                   }

                                   {
                                       id actualValue = values.data;
                                       VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }
};

class TV_AudioOutputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_AudioOutputCluster()
        : TestCommandBridge("TV_AudioOutputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_AudioOutputCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_AudioOutputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_AudioOutputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Audio Output list\n");
            err = TestReadAttributeAudioOutputList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute current audio output\n");
            err = TestReadAttributeCurrentAudioOutput_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Select Output Command\n");
            err = TestSelectOutputCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Rename Output Command\n");
            err = TestRenameOutputCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute Audio Output list\n");
            err = TestReadAttributeAudioOutputList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeAudioOutputList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Audio Output list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OutputList", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).name, @"HDMI"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentAudioOutput_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current audio output Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentOutput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectOutputCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Select Output Command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameOutputCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"HDMI Test";
        [cluster renameOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Rename Output Command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeAudioOutputList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Audio Output list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OutputList", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).name, @"HDMI"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationLauncherCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ApplicationLauncherCluster()
        : TestCommandBridge("TV_ApplicationLauncherCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ApplicationLauncherCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ApplicationLauncherCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ApplicationLauncherCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Application Launcher list\n");
            err = TestReadAttributeApplicationLauncherList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute application launcher app\n");
            err = TestReadAttributeApplicationLauncherApp_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Launch App Command\n");
            err = TestLaunchAppCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Stop App Command\n");
            err = TestStopAppCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Hide App Command\n");
            err = TestHideAppCommand_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeApplicationLauncherList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Application Launcher list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CatalogList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 123U));
                VerifyOrReturn(CheckValue("", actualValue[1], 456U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationLauncherApp_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEP * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application launcher app Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("CurrentApp", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchAppCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterLaunchAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) params.application).applicationId = @"applicationId";

        params.data = [[NSData alloc] initWithBytes:"data" length:4];
        [cluster
            launchAppWithParams:params
                     completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Launch App Command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("status", actualValue, 0U));
                         }

                         {
                             id actualValue = values.data;
                             VerifyOrReturn(
                                 CheckValueAsString("data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStopAppCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterStopAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) params.application).applicationId = @"applicationId";

        [cluster
            stopAppWithParams:params
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Stop App Command Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.status;
                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                       }

                       {
                           id actualValue = values.data;
                           VerifyOrReturn(CheckValueAsString("data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideAppCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                     endpointID:@(1)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterHideAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) params.application).applicationId = @"applicationId";

        [cluster
            hideAppWithParams:params
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Hide App Command Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.status;
                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                       }

                       {
                           id actualValue = values.data;
                           VerifyOrReturn(CheckValueAsString("data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }
};

class TV_KeypadInputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_KeypadInputCluster()
        : TestCommandBridge("TV_KeypadInputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_KeypadInputCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_KeypadInputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_KeypadInputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Key Command\n");
            err = TestSendKeyCommand_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendKeyCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:3U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Key Command Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class TV_AccountLoginCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_AccountLoginCluster()
        : TestCommandBridge("TV_AccountLoginCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_AccountLoginCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_AccountLoginCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_AccountLoginCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Get Setup PIN Command\n");
            err = TestGetSetupPinCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Login Command\n");
            err = TestLoginCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Logout Command\n");
            err = TestLogoutCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestGetSetupPinCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
        params.tempAccountIdentifier = @"asdf";
        [cluster
            getSetupPINWithParams:params
                       completion:^(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Get Setup PIN Command Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.setupPIN;
                               VerifyOrReturn(CheckValueAsString("setupPIN", actualValue, @"tempPin123"));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLoginCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterLoginParams alloc] init];
        params.tempAccountIdentifier = @"asdf";
        params.setupPIN = @"tempPin123";
        [cluster loginWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Login Command Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLogoutCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                       endpointID:@(3)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster logoutWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Logout Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_WakeOnLanCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_WakeOnLanCluster()
        : TestCommandBridge("TV_WakeOnLanCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_WakeOnLanCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_WakeOnLanCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_WakeOnLanCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read mac address\n");
            err = TestReadMacAddress_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadMacAddress_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
                                                                                 endpointID:@(1)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMACAddressWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read mac address Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("MACAddress", actualValue, @"00:00:00:00:00"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationBasicCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ApplicationBasicCluster()
        : TestCommandBridge("TV_ApplicationBasicCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ApplicationBasicCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ApplicationBasicCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ApplicationBasicCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute vendor name\n");
            err = TestReadAttributeVendorName_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute vendor id\n");
            err = TestReadAttributeVendorId_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute application name\n");
            err = TestReadAttributeApplicationName_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute product id\n");
            err = TestReadAttributeProductId_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute application status\n");
            err = TestReadAttributeApplicationStatus_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute application status\n");
            err = TestReadAttributeApplicationStatus_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute application version\n");
            err = TestReadAttributeApplicationVersion_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute application allowed vendor list\n");
            err = TestReadAttributeApplicationAllowedVendorList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeVendorName_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor name Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("VendorName", actualValue, @"exampleVendorName1"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorId_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("VendorID", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationName_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application name Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("ApplicationName", actualValue, @"exampleName1"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeProductId_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute product id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ProductID", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationStatus_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application status Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationStatus_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationBasicApplication * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application status Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("catalogVendorId",
                    ((MTRApplicationBasicClusterApplicationBasicApplication *) actualValue).catalogVendorId, 123U));
                VerifyOrReturn(CheckValueAsString("applicationId",
                    ((MTRApplicationBasicClusterApplicationBasicApplication *) actualValue).applicationId, @"applicationId"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationVersion_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application version Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("ApplicationVersion", actualValue, @"exampleVersion"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationAllowedVendorList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                               endpointID:@(3)
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application allowed vendor list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AllowedVendorList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 456U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_MediaPlaybackCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_MediaPlaybackCluster()
        : TestCommandBridge("TV_MediaPlaybackCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_MediaPlaybackCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_MediaPlaybackCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_MediaPlaybackCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute playback state\n");
            err = TestReadAttributePlaybackState_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute start time\n");
            err = TestReadAttributeStartTime_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute duration\n");
            err = TestReadAttributeDuration_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute position\n");
            err = TestReadAttributePosition_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute playback speed\n");
            err = TestReadAttributePlaybackSpeed_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute seek range end\n");
            err = TestReadAttributeSeekRangeEnd_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute seek range start\n");
            err = TestReadAttributeSeekRangeStart_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Media Playback Play Command\n");
            err = TestMediaPlaybackPlayCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Media Playback Pause Command\n");
            err = TestMediaPlaybackPauseCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Media Playback Stop Command\n");
            err = TestMediaPlaybackStopCommand_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Media Playback Start Over Command\n");
            err = TestMediaPlaybackStartOverCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Media Playback Previous Command\n");
            err = TestMediaPlaybackPreviousCommand_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Media Playback Next Command\n");
            err = TestMediaPlaybackNextCommand_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Media Playback Rewind Command\n");
            err = TestMediaPlaybackRewindCommand_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Media Playback Fast Forward Command\n");
            err = TestMediaPlaybackFastForwardCommand_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Media Playback Skip Forward Command\n");
            err = TestMediaPlaybackSkipForwardCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read attribute position after skip forward\n");
            err = TestReadAttributePositionAfterSkipForward_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Media Playback Skip Backward Command\n");
            err = TestMediaPlaybackSkipBackwardCommand_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute position after skip backward\n");
            err = TestReadAttributePositionAfterSkipBackward_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Media Playback Seek Command\n");
            err = TestMediaPlaybackSeekCommand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute position after seek\n");
            err = TestReadAttributePositionAfterSeek_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributePlaybackState_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute playback state Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeStartTime_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute start time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartTime", actualValue));
                VerifyOrReturn(CheckValue("StartTime", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDuration_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute duration Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("Duration", actualValue));
                VerifyOrReturn(CheckValue("Duration", actualValue, 80000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePosition_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(CheckValue("updatedAt", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePlaybackSpeed_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute playback speed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSeekRangeEnd_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSeekRangeEndWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute seek range end Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SeekRangeEnd", actualValue));
                VerifyOrReturn(CheckValue("SeekRangeEnd", actualValue, 80000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSeekRangeStart_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSeekRangeStartWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute seek range start Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SeekRangeStart", actualValue));
                VerifyOrReturn(CheckValue("SeekRangeStart", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPlayCommand_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Play Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPauseCommand_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Pause Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackStopCommand_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopPlaybackWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Stop Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackStartOverCommand_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            startOverWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Start Over Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPreviousCommand_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            previousWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Previous Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackNextCommand_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Next Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackRewindCommand_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Rewind Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackFastForwardCommand_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Fast Forward Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSkipForwardCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:500ULL];
        [cluster
            skipForwardWithParams:params
                       completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Media Playback Skip Forward Command Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.status;
                               VerifyOrReturn(CheckValue("status", actualValue, 0U));
                           }

                           {
                               id actualValue = values.data;
                               VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSkipForward_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after skip forward Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(CheckValue("updatedAt", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 500ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSkipBackwardCommand_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:100ULL];
        [cluster
            skipBackwardWithParams:params
                        completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Media Playback Skip Backward Command Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("status", actualValue, 0U));
                            }

                            {
                                id actualValue = values.data;
                                VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSkipBackward_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after skip backward Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(CheckValue("updatedAt", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 400ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSeekCommand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:1000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Media Playback Seek Command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("status", actualValue, 0U));
                         }

                         {
                             id actualValue = values.data;
                             VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSeek_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after seek Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(CheckValue("updatedAt", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 1000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ChannelCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ChannelCluster()
        : TestCommandBridge("TV_ChannelCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ChannelCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ChannelCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ChannelCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Channel list\n");
            err = TestReadAttributeChannelList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute channel lineup\n");
            err = TestReadAttributeChannelLineup_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute current channel\n");
            err = TestReadAttributeCurrentChannel_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Change Channel Command\n");
            err = TestChangeChannelCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Change Channel By Number Command\n");
            err = TestChangeChannelByNumberCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Skip Channel Command\n");
            err = TestSkipChannelCommand_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeChannelList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Channel list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ChannelList", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[0]).majorNumber, 6U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[0]).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[0]).name, @"ABC"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[0]).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[0]).affiliateCallSign, @"KAAL"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[1]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[1]).minorNumber, 1U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[1]).name, @"PBS"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[1]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[1]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[2]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[2]).minorNumber, 2U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[2]).name, @"PBS Kids"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[2]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[2]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[3]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[3]).minorNumber, 3U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[3]).name, @"World Channel"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[3]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[3]).affiliateCallSign, @"KCTS"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeChannelLineup_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute channel lineup Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("Lineup", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("operatorName", ((MTRChannelClusterLineupInfo *) actualValue).operatorName, @"Comcast"));
                VerifyOrReturn(CheckValueAsString(
                    "lineupName", ((MTRChannelClusterLineupInfo *) actualValue).lineupName, @"Comcast King County"));
                VerifyOrReturn(
                    CheckValueAsString("postalCode", ((MTRChannelClusterLineupInfo *) actualValue).postalCode, @"98052"));
                VerifyOrReturn(CheckValue("lineupInfoType", ((MTRChannelClusterLineupInfo *) actualValue).lineupInfoType, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentChannel_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfo * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current channel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue).majorNumber, 6U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue).name, @"ABC"));
                VerifyOrReturn(CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue).affiliateCallSign, @"KAAL"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeChannelCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelParams alloc] init];
        params.match = @"PBS";
        [cluster
            changeChannelWithParams:params
                         completion:^(MTRChannelClusterChangeChannelResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Change Channel Command Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.data;
                                 VerifyOrReturn(CheckValueAsString("data", actualValue, @"data response"));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeChannelByNumberCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
        params.majorNumber = [NSNumber numberWithUnsignedShort:6U];
        params.minorNumber = [NSNumber numberWithUnsignedShort:0U];
        [cluster changeChannelByNumberWithParams:params
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Change Channel By Number Command Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSkipChannelCommand_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Skip Channel Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }
};

class TV_LowPowerCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_LowPowerCluster()
        : TestCommandBridge("TV_LowPowerCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_LowPowerCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_LowPowerCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_LowPowerCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Sleep Input Status Command\n");
            err = TestSleepInputStatusCommand_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSleepInputStatusCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Sleep Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ContentLauncherCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ContentLauncherCluster()
        : TestCommandBridge("TV_ContentLauncherCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ContentLauncherCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ContentLauncherCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ContentLauncherCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute accept header list\n");
            err = TestReadAttributeAcceptHeaderList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute supported streaming protocols\n");
            err = TestReadAttributeSupportedStreamingProtocols_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Launch Content Command\n");
            err = TestLaunchContentCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Launch URL Command\n");
            err = TestLaunchUrlCommand_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeAcceptHeaderList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute accept header list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptHeader", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0], @"example"));
                VerifyOrReturn(CheckValueAsString("", actualValue[1], @"example"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSupportedStreamingProtocols_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute supported streaming protocols Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SupportedStreamingProtocols", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchContentCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRContentLauncherClusterLaunchContentParams alloc] init];
        params.search = [[MTRContentLauncherClusterContentSearch alloc] init];
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRContentLauncherClusterParameter alloc] init];
            ((MTRContentLauncherClusterParameter *) temp_1[0]).type = [NSNumber numberWithUnsignedChar:1U];
            ((MTRContentLauncherClusterParameter *) temp_1[0]).value = @"exampleValue";
            {
                NSMutableArray * temp_4 = [[NSMutableArray alloc] init];
                temp_4[0] = [[MTRContentLauncherClusterAdditionalInfo alloc] init];
                ((MTRContentLauncherClusterAdditionalInfo *) temp_4[0]).name = @"name";
                ((MTRContentLauncherClusterAdditionalInfo *) temp_4[0]).value = @"value";

                ((MTRContentLauncherClusterParameter *) temp_1[0]).externalIDList = temp_4;
            }

            ((MTRContentLauncherClusterContentSearch *) params.search).parameterList = temp_1;
        }

        params.autoPlay = [NSNumber numberWithBool:true];
        params.data = @"exampleData";
        [cluster
            launchContentWithParams:params
                         completion:^(MTRContentLauncherClusterLaunchResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Launch Content Command Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.data;
                                 VerifyOrReturn(CheckValueAsString("data", actualValue, @"exampleData"));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchUrlCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                             endpointID:@(1)
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRContentLauncherClusterLaunchURLParams alloc] init];
        params.contentURL = @"exampleUrl";
        params.displayString = @"exampleDisplayString";
        params.brandingInformation = [[MTRContentLauncherClusterBrandingInformation alloc] init];
        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).providerName = @"exampleName";
        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).background =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).logo =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).progressBar =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).splash =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).waterMark =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        [cluster launchURLWithParams:params
                          completion:^(MTRContentLauncherClusterLaunchResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"Launch URL Command Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.data;
                                  VerifyOrReturn(CheckValueAsString("data", actualValue, @"exampleData"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class TV_MediaInputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_MediaInputCluster()
        : TestCommandBridge("TV_MediaInputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_MediaInputCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_MediaInputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_MediaInputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute media input list\n");
            err = TestReadAttributeMediaInputList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current media input\n");
            err = TestReadCurrentMediaInput_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Select Input Command\n");
            err = TestSelectInputCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Hide Input Status Command\n");
            err = TestHideInputStatusCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Show Input Status Command\n");
            err = TestShowInputStatusCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Rename Input Command\n");
            err = TestRenameInputCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute media input list\n");
            err = TestReadAttributeMediaInputList_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeMediaInputList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute media input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("InputList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[0]).descriptionString, @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[1]).descriptionString, @"High-Definition Multimedia Interface"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentMediaInput_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current media input Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentInput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectInputCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Select Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideInputStatusCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Hide Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestShowInputStatusCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Show Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameInputCommand_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"HDMI Test";
        [cluster renameInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Rename Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeMediaInputList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute media input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("InputList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[0]).descriptionString, @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[1]).descriptionString, @"High-Definition Multimedia Interface"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCASERecovery : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCASERecovery()
        : TestCommandBridge("TestCASERecovery")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCASERecovery() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCASERecovery\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCASERecovery\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read an attribute\n");
            err = TestReadAnAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reboot the server\n");
            err = TestRebootTheServer_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Re-get our session, but without expiring sesssions\n");
            err = TestReGetOurSessionButWithoutExpiringSesssions_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read an attribute again\n");
            err = TestReadAnAttributeAgain_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Re-get our session, but without expiring sesssions\n");
            err = TestReGetOurSessionButWithoutExpiringSesssions_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read an attribute a third time\n");
            err = TestReadAnAttributeAThirdTime_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DataModelRevision", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTheServer_2()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_3()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        value.expireExistingSession.Emplace();
        value.expireExistingSession.Value() = false;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttributeAgain_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute again Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        value.expireExistingSession.Emplace();
        value.expireExistingSession.Value() = false;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttributeAThirdTime_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute a third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DataModelRevision", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCluster()
        : TestCommandBridge("TestCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Command\n");
            err = TestSendTestCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Not Handled Command\n");
            err = TestSendTestNotHandledCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Test Specific Command\n");
            err = TestSendTestSpecificCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send failing Test Add Arguments Command\n");
            err = TestSendFailingTestAddArgumentsCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute BOOLEAN Default Value\n");
            err = TestReadAttributeBooleanDefaultValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write attribute BOOLEAN True\n");
            err = TestWriteAttributeBooleanTrue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute BOOLEAN True\n");
            err = TestReadAttributeBooleanTrue_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write attribute BOOLEAN False\n");
            err = TestWriteAttributeBooleanFalse_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read attribute BOOLEAN False\n");
            err = TestReadAttributeBooleanFalse_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Write attribute BITMAP8 Max Value\n");
            err = TestWriteAttributeBitmap8MaxValue_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute BITMAP8 Max Value\n");
            err = TestReadAttributeBitmap8MaxValue_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Write attribute BITMAP8 Min Value\n");
            err = TestWriteAttributeBitmap8MinValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read attribute BITMAP8 Min Value\n");
            err = TestReadAttributeBitmap8MinValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write attribute BITMAP16 Max Value\n");
            err = TestWriteAttributeBitmap16MaxValue_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute BITMAP16 Max Value\n");
            err = TestReadAttributeBitmap16MaxValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Write attribute BITMAP16 Min Value\n");
            err = TestWriteAttributeBitmap16MinValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read attribute BITMAP16 Min Value\n");
            err = TestReadAttributeBitmap16MinValue_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write attribute BITMAP32 Max Value\n");
            err = TestWriteAttributeBitmap32MaxValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read attribute BITMAP32 Max Value\n");
            err = TestReadAttributeBitmap32MaxValue_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Write attribute BITMAP32 Min Value\n");
            err = TestWriteAttributeBitmap32MinValue_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Read attribute BITMAP32 Min Value\n");
            err = TestReadAttributeBitmap32MinValue_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Write attribute BITMAP64 Max Value\n");
            err = TestWriteAttributeBitmap64MaxValue_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read attribute BITMAP64 Max Value\n");
            err = TestReadAttributeBitmap64MaxValue_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Write attribute BITMAP64 Min Value\n");
            err = TestWriteAttributeBitmap64MinValue_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read attribute BITMAP64 Min Value\n");
            err = TestReadAttributeBitmap64MinValue_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Write attribute INT8U Max Value\n");
            err = TestWriteAttributeInt8uMaxValue_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read attribute INT8U Max Value\n");
            err = TestReadAttributeInt8uMaxValue_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Write attribute INT8U Min Value\n");
            err = TestWriteAttributeInt8uMinValue_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read attribute INT8U Min Value\n");
            err = TestReadAttributeInt8uMinValue_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Write attribute INT16U Max Value\n");
            err = TestWriteAttributeInt16uMaxValue_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read attribute INT16U Max Value\n");
            err = TestReadAttributeInt16uMaxValue_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Write attribute INT16U Min Value\n");
            err = TestWriteAttributeInt16uMinValue_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Read attribute INT16U Min Value\n");
            err = TestReadAttributeInt16uMinValue_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Write attribute INT32U Max Value\n");
            err = TestWriteAttributeInt32uMaxValue_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read attribute INT32U Max Value\n");
            err = TestReadAttributeInt32uMaxValue_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Write attribute INT32U Min Value\n");
            err = TestWriteAttributeInt32uMinValue_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Read attribute INT32U Min Value\n");
            err = TestReadAttributeInt32uMinValue_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Write attribute INT64U Max Value\n");
            err = TestWriteAttributeInt64uMaxValue_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Read attribute INT64U Max Value\n");
            err = TestReadAttributeInt64uMaxValue_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Write attribute INT64U Min Value\n");
            err = TestWriteAttributeInt64uMinValue_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Read attribute INT64U Min Value\n");
            err = TestReadAttributeInt64uMinValue_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Write attribute INT8S Max Value\n");
            err = TestWriteAttributeInt8sMaxValue_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read attribute INT8S Max Value\n");
            err = TestReadAttributeInt8sMaxValue_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Write attribute INT8S Min Value\n");
            err = TestWriteAttributeInt8sMinValue_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Read attribute INT8S Min Value\n");
            err = TestReadAttributeInt8sMinValue_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Write attribute INT8S Default Value\n");
            err = TestWriteAttributeInt8sDefaultValue_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Write attribute INT16S Max Value\n");
            err = TestWriteAttributeInt16sMaxValue_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Read attribute INT16S Max Value\n");
            err = TestReadAttributeInt16sMaxValue_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Write attribute INT16S Min Value\n");
            err = TestWriteAttributeInt16sMinValue_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Read attribute INT16S Min Value\n");
            err = TestReadAttributeInt16sMinValue_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Write attribute INT16S Default Value\n");
            err = TestWriteAttributeInt16sDefaultValue_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Write attribute INT32S Max Value\n");
            err = TestWriteAttributeInt32sMaxValue_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Read attribute INT32S Max Value\n");
            err = TestReadAttributeInt32sMaxValue_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Write attribute INT32S Min Value\n");
            err = TestWriteAttributeInt32sMinValue_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Read attribute INT32S Min Value\n");
            err = TestReadAttributeInt32sMinValue_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Write attribute INT32S Default Value\n");
            err = TestWriteAttributeInt32sDefaultValue_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Write attribute INT64S Max Value\n");
            err = TestWriteAttributeInt64sMaxValue_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Read attribute INT64S Max Value\n");
            err = TestReadAttributeInt64sMaxValue_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Write attribute INT64S Min Value\n");
            err = TestWriteAttributeInt64sMinValue_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Read attribute INT64S Min Value\n");
            err = TestReadAttributeInt64sMinValue_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Write attribute INT64S Default Value\n");
            err = TestWriteAttributeInt64sDefaultValue_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read attribute SINGLE Default Value\n");
            err = TestReadAttributeSingleDefaultValue_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Write attribute SINGLE medium Value\n");
            err = TestWriteAttributeSingleMediumValue_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Read attribute SINGLE medium Value\n");
            err = TestReadAttributeSingleMediumValue_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Write attribute SINGLE large Value\n");
            err = TestWriteAttributeSingleLargeValue_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Read attribute SINGLE large Value\n");
            err = TestReadAttributeSingleLargeValue_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Write attribute SINGLE small Value\n");
            err = TestWriteAttributeSingleSmallValue_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Read attribute SINGLE small Value\n");
            err = TestReadAttributeSingleSmallValue_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Write attribute SINGLE Default Value\n");
            err = TestWriteAttributeSingleDefaultValue_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Read attribute SINGLE Default Value\n");
            err = TestReadAttributeSingleDefaultValue_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Read attribute DOUBLE Default Value\n");
            err = TestReadAttributeDoubleDefaultValue_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Write attribute DOUBLE medium Value\n");
            err = TestWriteAttributeDoubleMediumValue_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Read attribute DOUBLE medium Value\n");
            err = TestReadAttributeDoubleMediumValue_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Write attribute DOUBLE large Value\n");
            err = TestWriteAttributeDoubleLargeValue_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Read attribute DOUBLE large Value\n");
            err = TestReadAttributeDoubleLargeValue_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Write attribute DOUBLE small Value\n");
            err = TestWriteAttributeDoubleSmallValue_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Read attribute DOUBLE small Value\n");
            err = TestReadAttributeDoubleSmallValue_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Write attribute DOUBLE Default Value\n");
            err = TestWriteAttributeDoubleDefaultValue_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Read attribute DOUBLE Default Value\n");
            err = TestReadAttributeDoubleDefaultValue_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_97();
            break;
        case 98:
            ChipLogProgress(chipTool, " ***** Test Step 98 : Write attribute ENUM8 Max Value\n");
            err = TestWriteAttributeEnum8MaxValue_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Read attribute ENUM8 Max Value\n");
            err = TestReadAttributeEnum8MaxValue_99();
            break;
        case 100:
            ChipLogProgress(chipTool, " ***** Test Step 100 : Write attribute ENUM8 Min Value\n");
            err = TestWriteAttributeEnum8MinValue_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Read attribute ENUM8 Min Value\n");
            err = TestReadAttributeEnum8MinValue_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Write attribute ENUM16 Max Value\n");
            err = TestWriteAttributeEnum16MaxValue_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Read attribute ENUM16 Max Value\n");
            err = TestReadAttributeEnum16MaxValue_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Write attribute ENUM16 Min Value\n");
            err = TestWriteAttributeEnum16MinValue_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Read attribute ENUM16 Min Value\n");
            err = TestReadAttributeEnum16MinValue_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Read attribute OCTET_STRING Default Value\n");
            err = TestReadAttributeOctetStringDefaultValue_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Write attribute OCTET_STRING with embedded null\n");
            err = TestWriteAttributeOctetStringWithEmbeddedNull_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Read attribute OCTET_STRING with embedded null\n");
            err = TestReadAttributeOctetStringWithEmbeddedNull_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Write attribute OCTET_STRING with hex: format\n");
            err = TestWriteAttributeOctetStringWithHexFormat_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Read attribute OCTET_STRING with hex: format\n");
            err = TestReadAttributeOctetStringWithHexFormat_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Write attribute OCTET_STRING with weird chars\n");
            err = TestWriteAttributeOctetStringWithWeirdChars_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Read attribute OCTET_STRING with weird chars\n");
            err = TestReadAttributeOctetStringWithWeirdChars_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Read attribute OCTET_STRING\n");
            err = TestReadAttributeOctetString_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Read attribute OCTET_STRING\n");
            err = TestReadAttributeOctetString_117();
            break;
        case 118:
            ChipLogProgress(chipTool, " ***** Test Step 118 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_118();
            break;
        case 119:
            ChipLogProgress(chipTool, " ***** Test Step 119 : Read attribute LONG_OCTET_STRING Default Value\n");
            err = TestReadAttributeLongOctetStringDefaultValue_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Write attribute LONG_OCTET_STRING\n");
            err = TestWriteAttributeLongOctetString_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Read attribute LONG_OCTET_STRING\n");
            err = TestReadAttributeLongOctetString_121();
            break;
        case 122:
            ChipLogProgress(chipTool, " ***** Test Step 122 : Write attribute LONG_OCTET_STRING\n");
            err = TestWriteAttributeLongOctetString_122();
            break;
        case 123:
            ChipLogProgress(chipTool, " ***** Test Step 123 : Read attribute CHAR_STRING Default Value\n");
            err = TestReadAttributeCharStringDefaultValue_123();
            break;
        case 124:
            ChipLogProgress(chipTool, " ***** Test Step 124 : Write attribute CHAR_STRING\n");
            err = TestWriteAttributeCharString_124();
            break;
        case 125:
            ChipLogProgress(chipTool, " ***** Test Step 125 : Read attribute CHAR_STRING\n");
            err = TestReadAttributeCharString_125();
            break;
        case 126:
            ChipLogProgress(chipTool, " ***** Test Step 126 : Write attribute CHAR_STRING - Value too long\n");
            err = TestWriteAttributeCharStringValueTooLong_126();
            break;
        case 127:
            ChipLogProgress(chipTool, " ***** Test Step 127 : Read attribute CHAR_STRING\n");
            err = TestReadAttributeCharString_127();
            break;
        case 128:
            ChipLogProgress(chipTool, " ***** Test Step 128 : Write attribute CHAR_STRING - Empty\n");
            err = TestWriteAttributeCharStringEmpty_128();
            break;
        case 129:
            ChipLogProgress(chipTool, " ***** Test Step 129 : Read attribute LONG_CHAR_STRING Default Value\n");
            err = TestReadAttributeLongCharStringDefaultValue_129();
            break;
        case 130:
            ChipLogProgress(chipTool, " ***** Test Step 130 : Write attribute LONG_CHAR_STRING\n");
            err = TestWriteAttributeLongCharString_130();
            break;
        case 131:
            ChipLogProgress(chipTool, " ***** Test Step 131 : Read attribute LONG_CHAR_STRING\n");
            err = TestReadAttributeLongCharString_131();
            break;
        case 132:
            ChipLogProgress(chipTool, " ***** Test Step 132 : Write attribute LONG_CHAR_STRING\n");
            err = TestWriteAttributeLongCharString_132();
            break;
        case 133:
            ChipLogProgress(chipTool, " ***** Test Step 133 : Read attribute LIST_LONG_OCTET_STRING (for chunked read)\n");
            err = TestReadAttributeListLongOctetStringForChunkedRead_133();
            break;
        case 134:
            ChipLogProgress(chipTool, " ***** Test Step 134 : Write attribute LIST_LONG_OCTET_STRING (for chunked write)\n");
            err = TestWriteAttributeListLongOctetStringForChunkedWrite_134();
            break;
        case 135:
            ChipLogProgress(chipTool, " ***** Test Step 135 : Read attribute LIST_LONG_OCTET_STRING (for chunked read)\n");
            err = TestReadAttributeListLongOctetStringForChunkedRead_135();
            break;
        case 136:
            ChipLogProgress(chipTool, " ***** Test Step 136 : 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");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestNotHandledCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testNotHandledWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Not Handled Command Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_INVALID_COMMAND));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestSpecificCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testSpecificWithCompletion:^(
            MTRUnitTestingClusterTestSpecificResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send Test Specific Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.returnValue;
                VerifyOrReturn(CheckValue("returnValue", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendFailingTestAddArgumentsCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:250U];
        params.arg2 = [NSNumber numberWithUnsignedChar:6U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send failing Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_INVALID_COMMAND));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanDefaultValue_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanTrue_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN True Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanTrue_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN True Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanFalse_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN False Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanFalse_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN False Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8MaxValue_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Max Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8MaxValue_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8MinValue_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Min Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8MinValue_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16MaxValue_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16MaxValue_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16MinValue_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16MinValue_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32MaxValue_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32MaxValue_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32MinValue_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32MinValue_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64MaxValue_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64MaxValue_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64MinValue_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64MinValue_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uMaxValue_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uMaxValue_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uMinValue_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uMinValue_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uMaxValue_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uMaxValue_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uMinValue_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uMinValue_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uMaxValue_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uMaxValue_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uMinValue_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uMinValue_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uMaxValue_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uMaxValue_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uMinValue_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uMinValue_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sMaxValue_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sMaxValue_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sMinValue_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sMinValue_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, -128));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sDefaultValue_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:0];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sMaxValue_59()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sMaxValue_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sMinValue_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:-32768];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sMinValue_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, -32768));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sDefaultValue_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:0];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_64()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_65()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sMaxValue_66()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:2147483647L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sMaxValue_67()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sMinValue_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sMinValue_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, -2147483648L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sDefaultValue_70()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:0L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_71()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_72()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sMaxValue_73()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sMaxValue_74()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sMinValue_75()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sMinValue_76()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sDefaultValue_77()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:0LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_78()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleDefaultValue_79()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleMediumValue_80()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE medium Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleMediumValue_81()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.1f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleLargeValue_82()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:17000000000.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE large Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleLargeValue_83()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE large Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 17000000000.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleSmallValue_84()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:1.7e-10f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE small Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleSmallValue_85()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE small Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 1.7e-10f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleDefaultValue_86()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleDefaultValue_87()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleDefaultValue_88()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleMediumValue_89()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE medium Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleMediumValue_90()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0.1234567890123));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleLargeValue_91()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e+200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE large Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleLargeValue_92()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE large Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 1.7e+200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleSmallValue_93()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e-200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE small Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleSmallValue_94()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE small Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 1.7e-200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleDefaultValue_95()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleDefaultValue_96()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_97()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8MaxValue_98()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8MaxValue_99()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8MinValue_100()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8MinValue_101()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_102()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16MaxValue_103()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16MaxValue_104()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16MinValue_105()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16MinValue_106()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringDefaultValue_107()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithEmbeddedNull_108()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"Tes\000ti\000ng" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with embedded null Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithEmbeddedNull_109()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with embedded null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"Tes\000ti\000ng" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithHexFormat_110()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"\x00\x01\x02\x03\x04\x05" length:6];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with hex: format Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithHexFormat_111()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with hex: format Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString(
                    "octet_string", actualValue, [[NSData alloc] initWithBytes:"\x00\x01\x02\x03\x04\x05" length:6]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithWeirdChars_112()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"\015\012\377\042\240" length:5];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with weird chars Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithWeirdChars_113()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with weird chars Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString(
                    "octet_string", actualValue, [[NSData alloc] initWithBytes:"\015\012\377\042\240" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_114()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetString_115()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_116()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValueLongerThan10" length:21];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetString_117()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_118()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongOctetStringDefaultValue_119()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongOctetString_120()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc]
            initWithBytes:"11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                   length:300];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LONG_OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongOctetString_121()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_octet_string", actualValue,
                    [[NSData alloc]
                        initWithBytes:
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                               length:300]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongOctetString_122()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LONG_OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringDefaultValue_123()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharString_124()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉T☉";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharString_125()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"☉T☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValueTooLong_126()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉TestValueLongerThan10☉";
        [cluster
            writeAttributeCharStringWithValue:charStringArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute CHAR_STRING - Value too long Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharString_127()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"☉T☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringEmpty_128()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING - Empty Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongCharStringDefaultValue_129()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongCharString_130()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument
            = @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LONG_CHAR_STRING Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongCharString_131()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_char_string", actualValue,
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongCharString_132()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument = @"";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LONG_CHAR_STRING Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_133()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST_LONG_OCTET_STRING (for chunked read) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_long_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListLongOctetStringForChunkedWrite_134()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listLongOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[1] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[2] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[3] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[4] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            listLongOctetStringArgument = temp_0;
        }
        [cluster
            writeAttributeListLongOctetStringWithValue:listLongOctetStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LIST_LONG_OCTET_STRING (for chunked write) Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_135()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST_LONG_OCTET_STRING (for chunked read) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_long_octet_string", [actualValue count], static_cast<uint32_t>(5)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[4],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_136()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsMaxValue_137()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Max Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsMaxValue_138()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsMinValue_139()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Min Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsMinValue_140()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_141()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSMaxValue_142()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSMaxValue_143()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSMinValue_144()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSMinValue_145()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUnsupported_146()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnsupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute UNSUPPORTED Error: %@", err);

            if (err.code == MTRInteractionErrorCodeUnsupportedAttribute) {
                NextTest();
                return;
            }

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("unsupported", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteattributeUnsupported_147()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unsupportedArgument;
        unsupportedArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeUnsupportedWithValue:unsupportedArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Writeattribute UNSUPPORTED Error: %@", err);

                                             if (err.code == MTRInteractionErrorCodeUnsupportedAttribute) {
                                                 NextTest();
                                                 return;
                                             }

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandToUnsupportedEndpoint_148()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(200)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command to unsupported endpoint Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandToUnsupportedCluster_149()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command to unsupported cluster Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_150()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorId_151()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:17U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorId_152()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 17U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreAttributeVendorId_153()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Restore attribute vendor_id Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandWithAVendorIdAndEnum_154()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            testEnumsRequestWithParams:params
                            completion:^(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Send a command with a vendor_id and enum Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.arg1;
                                    VerifyOrReturn(CheckValue("arg1", actualValue, 20003U));
                                }

                                {
                                    id actualValue = values.arg2;
                                    VerifyOrReturn(CheckValue("arg2", actualValue, 1U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandWithAVendorIdAndInvalidEnum_155()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:101U];
        [cluster
            testEnumsRequestWithParams:params
                            completion:^(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Send a command with a vendor_id and invalid enum Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.arg1;
                                    VerifyOrReturn(CheckValue("arg1", actualValue, 20003U));
                                }

                                {
                                    id actualValue = values.arg2;
                                    VerifyOrReturn(CheckValue("arg2", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsTrue_156()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                          completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                              NSError * _Nullable err) {
                                              NSLog(@"Send Test Command With Struct Argument and arg1.b is true Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              {
                                                  id actualValue = values.value;
                                                  VerifyOrReturn(CheckValue("value", actualValue, true));
                                              }

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsFalse_157()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                          completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                              NSError * _Nullable err) {
                                              NSLog(@"Send Test Command With Struct Argument and arg1.b is false Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              {
                                                  id actualValue = values.value;
                                                  VerifyOrReturn(CheckValue("value", actualValue, false));
                                              }

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructArgumentAndArg1cbIsTrue_158()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStruct alloc] init];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                           completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                               NSError * _Nullable err) {
                                               NSLog(
                                                   @"Send Test Command With Nested Struct Argument and arg1.c.b is true Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               {
                                                   id actualValue = values.value;
                                                   VerifyOrReturn(CheckValue("value", actualValue, true));
                                               }

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructArgumentArg1cbIsFalse_159()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStruct alloc] init];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                           completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                               NSError * _Nullable err) {
                                               NSLog(@"Send Test Command With Nested Struct Argument arg1.c.b is false Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               {
                                                   id actualValue = values.value;
                                                   VerifyOrReturn(CheckValue("value", actualValue, false));
                                               }

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndAllFieldsBOfArg1dAreTrue_160()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStructList alloc] init];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRUnitTestingClusterNestedStructList *) params.arg1).d = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedInt:1UL];
            temp_1[1] = [NSNumber numberWithUnsignedInt:2UL];
            temp_1[2] = [NSNumber numberWithUnsignedInt:3UL];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).e = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
            temp_1[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
            temp_1[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                                    completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                        NSError * _Nullable err) {
                                                        NSLog(@"Send Test Command With Nested Struct List Argument and all fields "
                                                              @"b of arg1.d are true Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                        {
                                                            id actualValue = values.value;
                                                            VerifyOrReturn(CheckValue("value", actualValue, true));
                                                        }

                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfArg1dAreFalse_161()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStructList alloc] init];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:false];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRUnitTestingClusterNestedStructList *) params.arg1).d = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedInt:1UL];
            temp_1[1] = [NSNumber numberWithUnsignedInt:2UL];
            temp_1[2] = [NSNumber numberWithUnsignedInt:3UL];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).e = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
            temp_1[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
            temp_1[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                                    completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                        NSError * _Nullable err) {
                                                        NSLog(@"Send Test Command With Nested Struct List Argument and some fields "
                                                              @"b of arg1.d are false Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                        {
                                                            id actualValue = values.value;
                                                            VerifyOrReturn(CheckValue("value", actualValue, false));
                                                        }

                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndSeeWhatWeGetBack_162()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterSimpleStructEchoRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:17U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.1f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0.1];

        [cluster
            simpleStructEchoRequestWithParams:params
                                   completion:^(MTRUnitTestingClusterSimpleStructResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Send Test Command With Struct Argument and see what we get back Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.arg1;
                                           VerifyOrReturn(
                                               CheckValue("a", ((MTRUnitTestingClusterSimpleStruct *) actualValue).a, 17U));
                                           VerifyOrReturn(
                                               CheckValue("b", ((MTRUnitTestingClusterSimpleStruct *) actualValue).b, false));
                                           VerifyOrReturn(
                                               CheckValue("c", ((MTRUnitTestingClusterSimpleStruct *) actualValue).c, 2U));
                                           VerifyOrReturn(
                                               CheckValueAsString("d", ((MTRUnitTestingClusterSimpleStruct *) actualValue).d,
                                                   [[NSData alloc] initWithBytes:"octet_string" length:12]));
                                           VerifyOrReturn(CheckValueAsString(
                                               "e", ((MTRUnitTestingClusterSimpleStruct *) actualValue).e, @"char_string"));
                                           VerifyOrReturn(
                                               CheckValue("f", ((MTRUnitTestingClusterSimpleStruct *) actualValue).f, 1U));
                                           VerifyOrReturn(
                                               CheckValue("g", ((MTRUnitTestingClusterSimpleStruct *) actualValue).g, 0.1f));
                                           VerifyOrReturn(
                                               CheckValue("h", ((MTRUnitTestingClusterSimpleStruct *) actualValue).h, 0.1));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_163()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UArgumentRequestWithParams:params
                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                            NSError * _Nullable err) {
                                            NSLog(@"Send Test Command With List of INT8U and none of them is set to 0 Error: %@",
                                                err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            {
                                                id actualValue = values.value;
                                                VerifyOrReturn(CheckValue("value", actualValue, true));
                                            }

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndOneOfThemIsSetTo0_164()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            temp_0[9] = [NSNumber numberWithUnsignedChar:0U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UArgumentRequestWithParams:params
                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                            NSError * _Nullable err) {
                                            NSLog(
                                                @"Send Test Command With List of INT8U and one of them is set to 0 Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            {
                                                id actualValue = values.value;
                                                VerifyOrReturn(CheckValue("value", actualValue, false));
                                            }

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndGetItReversed_165()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UReverseRequestWithParams:params
                                       completion:^(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable values,
                                           NSError * _Nullable err) {
                                           NSLog(@"Send Test Command With List of INT8U and get it reversed Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           {
                                               id actualValue = values.arg1;
                                               VerifyOrReturn(CheckValue("arg1", [actualValue count], static_cast<uint32_t>(9)));
                                               VerifyOrReturn(CheckValue("", actualValue[0], 9U));
                                               VerifyOrReturn(CheckValue("", actualValue[1], 8U));
                                               VerifyOrReturn(CheckValue("", actualValue[2], 7U));
                                               VerifyOrReturn(CheckValue("", actualValue[3], 6U));
                                               VerifyOrReturn(CheckValue("", actualValue[4], 5U));
                                               VerifyOrReturn(CheckValue("", actualValue[5], 4U));
                                               VerifyOrReturn(CheckValue("", actualValue[6], 3U));
                                               VerifyOrReturn(CheckValue("", actualValue[7], 2U));
                                               VerifyOrReturn(CheckValue("", actualValue[8], 1U));
                                           }

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithEmptyListOfInt8uAndGetAnEmptyListBack_166()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UReverseRequestWithParams:params
                                       completion:^(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable values,
                                           NSError * _Nullable err) {
                                           NSLog(@"Send Test Command With empty List of INT8U and get an empty list back Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           {
                                               id actualValue = values.arg1;
                                               VerifyOrReturn(CheckValue("arg1", [actualValue count], static_cast<uint32_t>(0)));
                                           }

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsTrue_167()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).e = @"first_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).e = @"second_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                              completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                  NSError * _Nullable err) {
                                                  NSLog(@"Send Test Command With List of Struct Argument and arg1.b of first item "
                                                        @"is true Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  {
                                                      id actualValue = values.value;
                                                      VerifyOrReturn(CheckValue("value", actualValue, true));
                                                  }

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsFalse_168()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).e = @"second_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:false];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).e = @"first_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                              completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                  NSError * _Nullable err) {
                                                  NSLog(@"Send Test Command With List of Struct Argument and arg1.b of first item "
                                                        @"is false Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  {
                                                      id actualValue = values.value;
                                                      VerifyOrReturn(CheckValue("value", actualValue, false));
                                                  }

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfNestedStructListArgumentAndAllFieldsBOfElementsOfArg1dAreTrue_169()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNestedStructList alloc] init];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).d = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedInt:1UL];
                temp_2[1] = [NSNumber numberWithUnsignedInt:2UL];
                temp_2[2] = [NSNumber numberWithUnsignedInt:3UL];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).e = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
                temp_2[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
                temp_2[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                            NSError * _Nullable err) {
                                                            NSLog(@"Send Test Command With List of Nested Struct List Argument and "
                                                                  @"all fields b of elements of arg1.d are true Error: %@",
                                                                err);

                                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                            {
                                                                id actualValue = values.value;
                                                                VerifyOrReturn(CheckValue("value", actualValue, true));
                                                            }

                                                            NextTest();
                                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfElementsOfArg1dAreFalse_170()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNestedStructList alloc] init];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:false];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).d = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedInt:1UL];
                temp_2[1] = [NSNumber numberWithUnsignedInt:2UL];
                temp_2[2] = [NSNumber numberWithUnsignedInt:3UL];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).e = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
                temp_2[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
                temp_2[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                            NSError * _Nullable err) {
                                                            NSLog(@"Send Test Command With Nested Struct List Argument and some "
                                                                  @"fields b of elements of arg1.d are false Error: %@",
                                                                err);

                                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                            {
                                                                id actualValue = values.value;
                                                                VerifyOrReturn(CheckValue("value", actualValue, false));
                                                            }

                                                            NextTest();
                                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfInt8uAndNoneOfThemIsSetTo0_171()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            listInt8uArgument = temp_0;
        }
        [cluster
            writeAttributeListInt8uWithValue:listInt8uArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write attribute LIST With List of INT8U and none of them is set to 0 Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfInt8u_172()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of INT8U Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
                VerifyOrReturn(CheckValue("", actualValue[2], 3U));
                VerifyOrReturn(CheckValue("", actualValue[3], 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfOctetString_173()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[NSData alloc] initWithBytes:"Test0" length:5];
            temp_0[1] = [[NSData alloc] initWithBytes:"Test1" length:5];
            temp_0[2] = [[NSData alloc] initWithBytes:"Test2" length:5];
            temp_0[3] = [[NSData alloc] initWithBytes:"Test3" length:5];
            listOctetStringArgument = temp_0;
        }
        [cluster writeAttributeListOctetStringWithValue:listOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LIST With List of OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfOctetString_174()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0], [[NSData alloc] initWithBytes:"Test0" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1], [[NSData alloc] initWithBytes:"Test1" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2], [[NSData alloc] initWithBytes:"Test2" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3], [[NSData alloc] initWithBytes:"Test3" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfListStructOctetString_175()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listStructOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[0]).member1 = [NSNumber numberWithUnsignedLongLong:0ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[0]).member2 = [[NSData alloc] initWithBytes:"Test0" length:5];

            temp_0[1] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[1]).member1 = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[1]).member2 = [[NSData alloc] initWithBytes:"Test1" length:5];

            temp_0[2] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[2]).member1 = [NSNumber numberWithUnsignedLongLong:2ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[2]).member2 = [[NSData alloc] initWithBytes:"Test2" length:5];

            temp_0[3] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[3]).member1 = [NSNumber numberWithUnsignedLongLong:3ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[3]).member2 = [[NSData alloc] initWithBytes:"Test3" length:5];

            listStructOctetStringArgument = temp_0;
        }
        [cluster
            writeAttributeListStructOctetStringWithValue:listStructOctetStringArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(
                                                      @"Write attribute LIST With List of LIST_STRUCT_OCTET_STRING Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfListStructOctetString_176()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListStructOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of LIST_STRUCT_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_struct_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[0]).member1, 0ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[0]).member2,
                    [[NSData alloc] initWithBytes:"Test0" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[1]).member1, 1ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[1]).member2,
                    [[NSData alloc] initWithBytes:"Test1" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[2]).member1, 2ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[2]).member2,
                    [[NSData alloc] initWithBytes:"Test2" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[3]).member1, 3ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[3]).member2,
                    [[NSData alloc] initWithBytes:"Test3" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithOptionalArgSet_177()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:5U];
        [cluster testNullableOptionalRequestWithParams:params
                                            completion:^(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable values,
                                                NSError * _Nullable err) {
                                                NSLog(@"Send Test Command with optional arg set. Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                {
                                                    id actualValue = values.wasPresent;
                                                    VerifyOrReturn(CheckValue("wasPresent", actualValue, true));
                                                }

                                                {
                                                    id actualValue = values.wasNull;
                                                    VerifyOrReturn(CheckValue("wasNull", actualValue, false));
                                                }

                                                {
                                                    id actualValue = values.value;
                                                    VerifyOrReturn(CheckValue("value", actualValue, 5U));
                                                }

                                                {
                                                    id actualValue = values.originalValue;
                                                    VerifyOrReturn(CheckValueNonNull("originalValue", actualValue));
                                                    VerifyOrReturn(CheckValue("originalValue", actualValue, 5U));
                                                }

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithoutItsOptionalArg_178()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
        [cluster testNullableOptionalRequestWithParams:params
                                            completion:^(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable values,
                                                NSError * _Nullable err) {
                                                NSLog(@"Send Test Command without its optional arg. Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                {
                                                    id actualValue = values.wasPresent;
                                                    VerifyOrReturn(CheckValue("wasPresent", actualValue, false));
                                                }

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionals_179()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read list of structs containing nullables and optionals Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_nullables_and_optionals_struct", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueNull(
                    "NullableInt", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNull(
                    "NullableList", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteListOfStructsContainingNullablesAndOptionals_180()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listNullablesAndOptionalsStructArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNullablesAndOptionalsStruct alloc] init];
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableInt = nil;
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableString = nil;
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableStruct = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedChar:1U];
                temp_3[1] = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableList = temp_3;
            }

            listNullablesAndOptionalsStructArgument = temp_0;
        }
        [cluster writeAttributeListNullablesAndOptionalsStructWithValue:listNullablesAndOptionalsStructArgument
                                                             completion:^(NSError * _Nullable err) {
                                                                 NSLog(@"Write list of structs containing nullables and optionals "
                                                                       @"Error: %@",
                                                                     err);

                                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                                 NextTest();
                                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionalsAfterWriting_181()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read list of structs containing nullables and optionals after writing Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_nullables_and_optionals_struct", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueNull(
                    "NullableInt", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNonNull(
                    "NullableList", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
                VerifyOrReturn(CheckValue("NullableList",
                    [((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList count],
                    static_cast<uint32_t>(2)));
                VerifyOrReturn(
                    CheckValue("", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[0], 1U));
                VerifyOrReturn(
                    CheckValue("", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[1], 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBooleanNull_182()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = nil;
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BOOLEAN null Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable booValueNull;

    CHIP_ERROR TestReadAttributeNullableBooleanNull_183()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_boolean", actualValue));
            }
            {
                booValueNull = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBooleanTrue_184()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BOOLEAN True Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBooleanTrue_185()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN True Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_boolean", actualValue));
                VerifyOrReturn(CheckValue("nullable_boolean", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBooleanNotNull_186()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableBoolean", value, booValueNull));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8MaxValue_187()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 Max Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8MaxValue_188()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap8", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8InvalidValue_189()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 Invalid Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable nullableValue254;

    CHIP_ERROR TestReadAttributeNullableBitmap8UnchangedValue_190()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap8", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap8", actualValue, 254U));
            }
            {
                nullableValue254 = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8NullValue_191()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = nil;
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 null Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8NullValue_192()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap8", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8Not254Value_193()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 not 254 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableBitmap8", value, nullableValue254));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16MaxValue_194()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16MaxValue_195()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap16", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16InvalidValue_196()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16UnchangedValue_197()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap16", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16NullValue_198()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = nil;
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16NullValue_199()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap16", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32MaxValue_200()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32MaxValue_201()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap32", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap32", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32InvalidValue_202()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32UnchangedValue_203()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap32", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap32", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32NullValue_204()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = nil;
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32NullValue_205()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap32", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64MaxValue_206()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64MaxValue_207()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap64", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap64", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64InvalidValue_208()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64UnchangedValue_209()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap64", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap64", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64NullValue_210()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = nil;
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64NullValue_211()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap64", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uMinValue_212()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uMinValue_213()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uMaxValue_214()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Max Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uMaxValue_215()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uInvalidValue_216()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValue_217()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValueWithConstraint_218()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U unchanged Value with constraint Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uNullValue_219()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = nil;
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValue_220()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int8u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValueRange_221()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValueNot_222()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8u", value, 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uValue_223()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:128U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uValueInRange_224()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNotValueOk_225()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8u", value, 129U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uMinValue_226()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uMinValue_227()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uMaxValue_228()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uMaxValue_229()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uInvalidValue_230()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uUnchangedValue_231()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uNullValue_232()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = nil;
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValue_233()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int16u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValueRange_234()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValueNot_235()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16u", value, 65534U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uValue_236()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:32000U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uValueInRange_237()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNotValueOk_238()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16u", value, 32001U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uMinValue_239()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uMinValue_240()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uMaxValue_241()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uMaxValue_242()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uInvalidValue_243()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uUnchangedValue_244()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uNullValue_245()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = nil;
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValue_246()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int32u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValueRange_247()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValueNot_248()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32u", value, 4294967294UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uValue_249()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:2147483647UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uValueInRange_250()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNotValueOk_251()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32u", value, 2147483648UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uMinValue_252()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uMinValue_253()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uMaxValue_254()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uMaxValue_255()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uInvalidValue_256()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uUnchangedValue_257()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uNullValue_258()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = nil;
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValue_259()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int64u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValueRange_260()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 0ULL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValueNot_261()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64u", value, 18446744073709551614ULL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uValue_262()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18000000000000000000ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uValueInRange_263()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 0ULL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNotValueOk_264()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64u", value, 18000000000000000001ULL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sMinValue_265()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sMinValue_266()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8s", actualValue, -127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sInvalidValue_267()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sUnchangedValue_268()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8s", actualValue, -127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sNullValue_269()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = nil;
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValue_270()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int8s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValueRange_271()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int8_t>("nullableInt8s", [value charValue], -127));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("nullableInt8s", [value charValue], 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValueNot_272()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8s", value, -127));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sValue_273()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sValueInRange_274()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int8_t>("nullableInt8s", [value charValue], -127));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("nullableInt8s", [value charValue], 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNotValueOk_275()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8s", value, -126));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sMinValue_276()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sMinValue_277()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16s", actualValue, -32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sInvalidValue_278()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sUnchangedValue_279()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16s", actualValue, -32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sNullValue_280()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = nil;
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValue_281()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int16s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValueRange_282()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int16_t>("nullableInt16s", [value shortValue], -32767));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("nullableInt16s", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValueNot_283()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16s", value, -32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sValue_284()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sValueInRange_285()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int16_t>("nullableInt16s", [value shortValue], -32767));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("nullableInt16s", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNotValueOk_286()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16s", value, -32766));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sMinValue_287()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sMinValue_288()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32s", actualValue, -2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sInvalidValue_289()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sUnchangedValue_290()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32s", actualValue, -2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sNullValue_291()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = nil;
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValue_292()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int32s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValueRange_293()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int32_t>("nullableInt32s", [value intValue], -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue<int32_t>("nullableInt32s", [value intValue], 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValueNot_294()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32s", value, -2147483647L));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sValue_295()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sValueInRange_296()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int32_t>("nullableInt32s", [value intValue], -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue<int32_t>("nullableInt32s", [value intValue], 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNotValueOk_297()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32s", value, -2147483646L));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sMinValue_298()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sMinValue_299()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sInvalidValue_300()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL - 1LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sUnchangedValue_301()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sNullValue_302()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = nil;
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValue_303()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int64s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValueRange_304()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int64_t>("nullableInt64s", [value longLongValue], -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue<int64_t>("nullableInt64s", [value longLongValue], 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValueNot_305()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64s", value, -9223372036854775807LL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sValue_306()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sValueInRange_307()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int64_t>("nullableInt64s", [value longLongValue], -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue<int64_t>("nullableInt64s", [value longLongValue], 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNotValueOk_308()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64s", value, -9223372036854775806LL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleMediumValue_309()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE medium Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleMediumValue_310()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, 0.1f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleLargestValue_311()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE largest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleLargestValue_312()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE largest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleSmallestValue_313()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:-INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE smallest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleSmallestValue_314()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE smallest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, -INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleNullValue_315()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = nil;
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE null Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleNullValue_316()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_float_single", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingle0Value_317()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE 0 Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingle0Value_318()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE 0 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleMediumValue_319()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE medium Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleMediumValue_320()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, 0.1234567890123));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleLargestValue_321()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE largest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleLargestValue_322()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE largest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleSmallestValue_323()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:-INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE smallest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleSmallestValue_324()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE smallest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, -INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleNullValue_325()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = nil;
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE null Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleNullValue_326()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_float_double", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDouble0Value_327()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE 0 Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDouble0Value_328()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE 0 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8MinValue_329()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8MinValue_330()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8MaxValue_331()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Max Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8MaxValue_332()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8InvalidValue_333()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8UnchangedValue_334()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8NullValue_335()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = nil;
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8NullValue_336()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum8", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16MinValue_337()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16MinValue_338()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16MaxValue_339()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16MaxValue_340()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16InvalidValue_341()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16UnchangedValue_342()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16NullValue_343()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = nil;
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16NullValue_344()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum16", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumMinValue_345()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Min Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumMinValue_346()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumMaxValue_347()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumMaxValue_348()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumInvalidValue_349()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable nullableEnumAttr3;

    CHIP_ERROR TestReadAttributeNullableSimpleEnumUnchangedValue_350()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 3U));
            }
            {
                nullableEnumAttr3 = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumNullValue_351()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = nil;
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumNullValue_352()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum_attr", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumNot3Value_353()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM not 3 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableEnumAttr", value, nullableEnumAttr3));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetStringDefaultValue_354()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_355()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nullable nullableOctetStrTestValue;

    CHIP_ERROR TestReadAttributeNullableOctetString_356()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }
            {
                nullableOctetStrTestValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_357()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = nil;
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetString_358()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_octet_string", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_359()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetString_360()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetStringNotTestValue_361()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING not TestValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableOctetString", value, nullableOctetStrTestValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharStringDefaultValue_362()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharString_363()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"☉T☉";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nullable nullableCharStringSave;

    CHIP_ERROR TestReadAttributeNullableCharString_364()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @"☉T☉"));
            }
            {
                nullableCharStringSave = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_365()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (nullableCharStringSave == nil) {
                    VerifyOrReturn(CheckValueNull("nullable_char_string", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                    VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, nullableCharStringSave));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharStringValueTooLong_366()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = nil;
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING - Value too long Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_367()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_char_string", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharStringEmpty_368()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING - Empty Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_369()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharStringNott_370()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING not ☉T☉ Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableCharString", value, nullableCharStringSave));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeFromNonexistentEndpoint_371()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(200)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute from nonexistent endpoint. Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeFromNonexistentCluster_372()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute from nonexistent cluster. Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_373()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        [cluster testSimpleOptionalArgumentRequestWithParams:params
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Send a command that takes an optional parameter but do not set it. "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_INVALID_VALUE));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_374()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithBool:1];
        [cluster testSimpleOptionalArgumentRequestWithParams:params
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Send a command that takes an optional parameter but do not set it. "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestCluster_375_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestCluster_list_int8u_Reported = nil;

    CHIP_ERROR TestReportSubscribeToListAttribute_375()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe to list attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
                VerifyOrReturn(CheckValue("", actualValue[2], 3U));
                VerifyOrReturn(CheckValue("", actualValue[3], 4U));
            }

            testSendClusterTestCluster_375_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeToListAttribute_376()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeListInt8uWithParams: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");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:8U];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write subscribed-to list attribute Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForListAttributeReport_378()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for list attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 5U));
                VerifyOrReturn(CheckValue("", actualValue[1], 6U));
                VerifyOrReturn(CheckValue("", actualValue[2], 7U));
                VerifyOrReturn(CheckValue("", actualValue[3], 8U));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedUnsigned8BitInteger_379()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted unsigned 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned8BitInteger_380()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write min value to a range-restricted unsigned 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned8BitInteger_381()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-below-range value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned8BitInteger_382()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-above-range value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned8BitInteger_383()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write max value to a range-restricted unsigned 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_384()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned8BitInteger_385()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write min valid value to a range-restricted unsigned 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_386()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 20U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned8BitInteger_387()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write max valid value to a range-restricted unsigned 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_388()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned8BitInteger_389()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write middle valid value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_390()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedUnsigned16BitInteger_391()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted unsigned 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned16BitInteger_392()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write min value to a range-restricted unsigned 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned16BitInteger_393()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-below-range value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned16BitInteger_394()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-above-range value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned16BitInteger_395()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write max value to a range-restricted unsigned 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_396()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned16BitInteger_397()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write min valid value to a range-restricted unsigned 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_398()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned16BitInteger_399()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write max valid value to a range-restricted unsigned 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_400()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 1000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned16BitInteger_401()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write middle valid value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_402()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedSigned8BitInteger_403()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted signed 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned8BitInteger_404()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write min value to a range-restricted signed 8-bit integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned8BitInteger_405()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-below-range value to a range-restricted signed 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned8BitInteger_406()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-above-range value to a range-restricted signed 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned8BitInteger_407()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write max value to a range-restricted signed 8-bit integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueHasNotChanged_408()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned8BitInteger_409()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(
                                                     @"Write min valid value to a range-restricted signed 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMinValid_410()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -40));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned8BitInteger_411()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(
                                                     @"Write max valid value to a range-restricted signed 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_412()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, 50));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned8BitInteger_413()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write middle valid value to a range-restricted signed 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMidValid_414()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, 6));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedSigned16BitInteger_415()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted signed 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned16BitInteger_416()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write min value to a range-restricted signed 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned16BitInteger_417()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-below-range value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned16BitInteger_418()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-above-range value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned16BitInteger_419()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write max value to a range-restricted signed 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueHasNotChanged_420()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned16BitInteger_421()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write min valid value to a range-restricted signed 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMinValid_422()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -150));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned16BitInteger_423()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write max valid value to a range-restricted signed 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_424()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, 200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned16BitInteger_425()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write middle valid value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMidValid_426()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, 7));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedUnsigned8BitInteger_427()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted unsigned 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned8BitInteger_428()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned8BitInteger_429()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned8BitInteger_430()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned8BitInteger_431()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_432()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned8BitInteger_433()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_434()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 20U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned8BitInteger_435()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_436()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned8BitInteger_437()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_438()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned8BitInteger_439()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write null value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsNull_440()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int8u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedUnsigned16BitInteger_441()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted unsigned 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned16BitInteger_442()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned16BitInteger_443()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned16BitInteger_444()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned16BitInteger_445()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_446()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned16BitInteger_447()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_448()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned16BitInteger_449()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_450()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 1000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned16BitInteger_451()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_452()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned16BitInteger_453()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write null value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsNull_454()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int16u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedSigned8BitInteger_455()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted signed 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned8BitInteger_456()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned8BitInteger_457()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned8BitInteger_458()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned8BitInteger_459()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueHasNotChanged_460()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned8BitInteger_461()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min valid value to a nullable range-restricted signed "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMinValid_462()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -40));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned8BitInteger_463()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max valid value to a nullable range-restricted signed "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_464()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, 50));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned8BitInteger_465()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMidValid_466()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, 6));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned8BitInteger_467()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write null value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtNull_468()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int8s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedSigned16BitInteger_469()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted signed 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned16BitInteger_470()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned16BitInteger_471()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned16BitInteger_472()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned16BitInteger_473()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueHasNotChanged_474()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned16BitInteger_475()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min valid value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMinValid_476()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -150));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned16BitInteger_477()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max valid value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_478()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, 200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned16BitInteger_479()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMidValid_480()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, 7));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned16BitInteger_481()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write null value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsNull_482()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int16s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeThatReturnsGeneralStatusOnWrite_483()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id generalErrorBooleanArgument;
        generalErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeGeneralErrorBooleanWithValue:generalErrorBooleanArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute that returns general status on write Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeThatReturnsClusterSpecificStatusOnWrite_484()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id clusterErrorBooleanArgument;
        clusterErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeClusterErrorBooleanWithValue:clusterErrorBooleanArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute that returns cluster-specific status on write Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_FAILURE));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeThatReturnsGeneralStatusOnRead_485()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneralErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute that returns general status on read Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeThatReturnsClusterSpecificStatusOnRead_486()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read attribute that returns cluster-specific status on read Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListAttribute_487()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(18)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 2UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 7UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 11UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 12UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 13UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 14UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 15UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 17UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 18UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 19UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 20UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 21UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGeneratedCommandListAttribute_488()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read GeneratedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(9)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 5UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 6UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 11UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteStructTypedAttribute_489()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id structAttrArgument;
        structAttrArgument = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).a = [NSNumber numberWithUnsignedChar:5U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).d = [[NSData alloc] initWithBytes:"abc" length:3];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).e = @"";
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).f = [NSNumber numberWithUnsignedChar:17U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).g = [NSNumber numberWithFloat:1.5f];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).h = [NSNumber numberWithDouble:3.14159265358979];

        [cluster writeAttributeStructAttrWithValue:structAttrArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write struct-typed attribute Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStructTypedAttribute_490()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeStructAttrWithCompletion:^(MTRUnitTestingClusterSimpleStruct * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read struct-typed attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("a", ((MTRUnitTestingClusterSimpleStruct *) actualValue).a, 5U));
                    VerifyOrReturn(CheckValue("b", ((MTRUnitTestingClusterSimpleStruct *) actualValue).b, true));
                    VerifyOrReturn(CheckValue("c", ((MTRUnitTestingClusterSimpleStruct *) actualValue).c, 2U));
                    VerifyOrReturn(CheckValueAsString(
                        "d", ((MTRUnitTestingClusterSimpleStruct *) actualValue).d, [[NSData alloc] initWithBytes:"abc" length:3]));
                    VerifyOrReturn(CheckValueAsString("e", ((MTRUnitTestingClusterSimpleStruct *) actualValue).e, @""));
                    VerifyOrReturn(CheckValue("f", ((MTRUnitTestingClusterSimpleStruct *) actualValue).f, 17U));
                    VerifyOrReturn(CheckValue("g", ((MTRUnitTestingClusterSimpleStruct *) actualValue).g, 1.5f));
                    VerifyOrReturn(CheckValue("h", ((MTRUnitTestingClusterSimpleStruct *) actualValue).h, 3.14159265358979));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class TestConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestConstraints()
        : TestCommandBridge("TestConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestConstraints() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write attribute LIST With List of INT8U\n");
            err = TestWriteAttributeListWithListOfInt8u_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute LIST With Partial List of INT8U that should be in it\n");
            err = TestReadAttributeListWithPartialListOfInt8uThatShouldBeInIt_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Read attribute LIST With Partial List of INT8U that should not be included\n");
            err = TestReadAttributeListWithPartialListOfInt8uThatShouldNotBeIncluded_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write attribute LIST Back to Default Value\n");
            err = TestWriteAttributeListBackToDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write attribute BITMAP32 with MaskVal1 and MaskVal3\n");
            err = TestWriteAttributeBitmap32WithMaskVal1AndMaskVal3_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal2IsNotSet_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal1IsSet_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal3IsSet_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are "
                "set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskval1AndMaskVal3AreSet_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write attribute 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");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write attribute LIST With List of INT8U Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldBeInIt_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With Partial List of INT8U that should be in it Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 2U));
            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 3U));
            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldNotBeIncluded_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With Partial List of INT8U that should not be included Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintExcludes("listInt8u", value, 0U));
            VerifyOrReturn(CheckConstraintExcludes("listInt8u", value, 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListBackToDefaultValue_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write attribute LIST Back to Default Value Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32WithMaskVal1AndMaskVal3_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 with MaskVal1 and MaskVal3 Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal2IsNotSet_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal1IsSet_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal3IsSet_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskval1AndMaskVal3AreSet_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uValue_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueMinValueConstraints_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value MinValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("int32u", [value unsignedIntValue], 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueMaxValueConstraints_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value MaxValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("int32u", [value unsignedIntValue], 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueNotValueConstraints_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value NotValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32u", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uValueBackToDefaultValue_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Value Back to Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"** Test **";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueMinLengthConstraints_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value MinLength Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinLength("charString", value, 5));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueMaxLengthConstraints_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value MaxLength Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxLength("charString", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueStartsWithConstraints_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value StartsWith Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintStartsWith("charString", value, "**"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueEndsWithConstraints_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value EndsWith Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintEndsWith("charString", value, "**"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowercase";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, false));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, true));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"UPPERCASE";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, true));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowUPPER";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, false));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF012V";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isHexString Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsHexString("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF0123";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isHexString Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsHexString("charString", value, true));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValueBackToDefaultValue_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Back to Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
};

class TestDelayCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestDelayCommands()
        : TestCommandBridge("TestDelayCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestDelayCommands() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestDelayCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestDelayCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Wait 100ms\n");
            err = TestWait100ms_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWait100ms_1()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }
};

class TestLogCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestLogCommands()
        : TestCommandBridge("TestLogCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestLogCommands() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestLogCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestLogCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Log a simple message\n");
            err = TestLogASimpleMessage_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Do a simple user prompt message\n");
            err = TestDoASimpleUserPromptMessage_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestLogASimpleMessage_1()
    {
        chip::app::Clusters::LogCommands::Commands::Log::Type value;
        value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
        return Log("alpha", value);
    }

    CHIP_ERROR TestDoASimpleUserPromptMessage_2()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
        return UserPrompt("alpha", value);
    }
};

class TestSaveAs : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSaveAs()
        : TestCommandBridge("TestSaveAs")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSaveAs() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSaveAs\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSaveAs\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute BOOLEAN Default Value\n");
            err = TestReadAttributeBooleanDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write attribute BOOLEAN Not Default Value\n");
            err = TestWriteAttributeBooleanNotDefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute BOOLEAN Not Default Value\n");
            err = TestReadAttributeBooleanNotDefaultValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write attribute BOOLEAN DefaultValue\n");
            err = TestWriteAttributeBooleanDefaultValue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute BOOLEAN False\n");
            err = TestReadAttributeBooleanFalse_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Write attribute BITMAP8 Not Default Value\n");
            err = TestWriteAttributeBitmap8NotDefaultValue_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read attribute BITMAP8 Not Default Value\n");
            err = TestReadAttributeBitmap8NotDefaultValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Write attribute BITMAP8 Default Value\n");
            err = TestWriteAttributeBitmap8DefaultValue_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write attribute BITMAP16 Not Default Value\n");
            err = TestWriteAttributeBitmap16NotDefaultValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute BITMAP16 Not Default Value\n");
            err = TestReadAttributeBitmap16NotDefaultValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write attribute BITMAP16 Default Value\n");
            err = TestWriteAttributeBitmap16DefaultValue_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Write attribute BITMAP32 Not Default Value\n");
            err = TestWriteAttributeBitmap32NotDefaultValue_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute BITMAP32 Not Default Value\n");
            err = TestReadAttributeBitmap32NotDefaultValue_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write attribute BITMAP32 Default Value\n");
            err = TestWriteAttributeBitmap32DefaultValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Write attribute BITMAP64 Not Default Value\n");
            err = TestWriteAttributeBitmap64NotDefaultValue_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Write attribute BITMAP64 Default Value\n");
            err = TestWriteAttributeBitmap64DefaultValue_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Write attribute INT8U Not Default Value\n");
            err = TestWriteAttributeInt8uNotDefaultValue_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read attribute INT8U Not Default Value\n");
            err = TestReadAttributeInt8uNotDefaultValue_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Write attribute INT8U Default Value\n");
            err = TestWriteAttributeInt8uDefaultValue_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Write attribute INT16U Not Default Value\n");
            err = TestWriteAttributeInt16uNotDefaultValue_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read attribute INT16U Not Default Value\n");
            err = TestReadAttributeInt16uNotDefaultValue_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Write attribute INT16U Default Value\n");
            err = TestWriteAttributeInt16uDefaultValue_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Write attribute INT32U Not Default Value\n");
            err = TestWriteAttributeInt32uNotDefaultValue_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read attribute INT32U Not Default Value\n");
            err = TestReadAttributeInt32uNotDefaultValue_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Write attribute INT32U Default Value\n");
            err = TestWriteAttributeInt32uDefaultValue_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Write attribute INT64U Not Default Value\n");
            err = TestWriteAttributeInt64uNotDefaultValue_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read attribute INT64U Not Default Value\n");
            err = TestReadAttributeInt64uNotDefaultValue_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Write attribute INT64U Default Value\n");
            err = TestWriteAttributeInt64uDefaultValue_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Write attribute INT8S Not Default Value\n");
            err = TestWriteAttributeInt8sNotDefaultValue_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read attribute INT8S Not Default Value\n");
            err = TestReadAttributeInt8sNotDefaultValue_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Write attribute INT8S Default Value\n");
            err = TestWriteAttributeInt8sDefaultValue_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Write attribute INT16S Not Default Value\n");
            err = TestWriteAttributeInt16sNotDefaultValue_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Read attribute INT16S Not Default Value\n");
            err = TestReadAttributeInt16sNotDefaultValue_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Write attribute INT16S Default Value\n");
            err = TestWriteAttributeInt16sDefaultValue_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Write attribute INT32S Not Default Value\n");
            err = TestWriteAttributeInt32sNotDefaultValue_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Read attribute INT32S Not Default Value\n");
            err = TestReadAttributeInt32sNotDefaultValue_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Write attribute INT32S Default Value\n");
            err = TestWriteAttributeInt32sDefaultValue_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Write attribute INTS Not Default Value\n");
            err = TestWriteAttributeIntsNotDefaultValue_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Read attribute INT64S Not Default Value\n");
            err = TestReadAttributeInt64sNotDefaultValue_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Write attribute INT64S Default Value\n");
            err = TestWriteAttributeInt64sDefaultValue_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Write attribute ENUM8 Not Default Value\n");
            err = TestWriteAttributeEnum8NotDefaultValue_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Read attribute ENUM8 Not Default Value\n");
            err = TestReadAttributeEnum8NotDefaultValue_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Write attribute ENUM8 Default Value\n");
            err = TestWriteAttributeEnum8DefaultValue_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Write attribute ENUM16 Not Default Value\n");
            err = TestWriteAttributeEnum16NotDefaultValue_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Read attribute ENUM16 Not Default Value\n");
            err = TestReadAttributeEnum16NotDefaultValue_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Write attribute ENUM16 Default Value\n");
            err = TestWriteAttributeEnum16DefaultValue_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Write attribute EPOCH_US Not Default Value\n");
            err = TestWriteAttributeEpochUsNotDefaultValue_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Read attribute EPOCH_US Not Default Value\n");
            err = TestReadAttributeEpochUsNotDefaultValue_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Write attribute EPOCH_US Default Value\n");
            err = TestWriteAttributeEpochUsDefaultValue_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Write attribute EPOCH_S Not Default Value\n");
            err = TestWriteAttributeEpochSNotDefaultValue_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Read attribute EPOCH_S Not Default Value\n");
            err = TestReadAttributeEpochSNotDefaultValue_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Write attribute EPOCH_S Default Value\n");
            err = TestWriteAttributeEpochSDefaultValue_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Write attribute vendor_id Not Default Value\n");
            err = TestWriteAttributeVendorIdNotDefaultValue_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Read attribute vendor_id Not Default Value\n");
            err = TestReadAttributeVendorIdNotDefaultValue_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Write attribute vendor_id Default Value\n");
            err = TestWriteAttributeVendorIdDefaultValue_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Read attribute char_string Default Value\n");
            err = TestReadAttributeCharStringDefaultValue_94();
            break;
        case 95:
            ChipLogProgress(
                chipTool, " ***** Test Step 95 : Read attribute char_string Default Value and compare to saved value\n");
            err = TestReadAttributeCharStringDefaultValueAndCompareToSavedValue_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Write attribute char_string Not Default Value\n");
            err = TestWriteAttributeCharStringNotDefaultValue_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Read attribute char_string Not Default Value\n");
            err = TestReadAttributeCharStringNotDefaultValue_97();
            break;
        case 98:
            ChipLogProgress(
                chipTool, " ***** Test Step 98 : Read attribute char_string Not Default Value and compare to saved value\n");
            err = TestReadAttributeCharStringNotDefaultValueAndCompareToSavedValue_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Write attribute char_string Not Default Value from saved value\n");
            err = TestWriteAttributeCharStringNotDefaultValueFromSavedValue_99();
            break;
        case 100:
            ChipLogProgress(
                chipTool, " ***** Test Step 100 : Read attribute char_string Not Default Value and compare to expected value\n");
            err = TestReadAttributeCharStringNotDefaultValueAndCompareToExpectedValue_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Write attribute char_string Default Value\n");
            err = TestWriteAttributeCharStringDefaultValue_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Read attribute octet_string Default Value\n");
            err = TestReadAttributeOctetStringDefaultValue_102();
            break;
        case 103:
            ChipLogProgress(
                chipTool, " ***** Test Step 103 : Read attribute octet_string Default Value and compare to saved value\n");
            err = TestReadAttributeOctetStringDefaultValueAndCompareToSavedValue_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Write attribute octet_string Not Default Value\n");
            err = TestWriteAttributeOctetStringNotDefaultValue_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Read attribute octet_string Not Default Value\n");
            err = TestReadAttributeOctetStringNotDefaultValue_105();
            break;
        case 106:
            ChipLogProgress(
                chipTool, " ***** Test Step 106 : Read attribute octet_string Not Default Value and compare to saved value\n");
            err = TestReadAttributeOctetStringNotDefaultValueAndCompareToSavedValue_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Write attribute octet_string Not Default Value from saved value\n");
            err = TestWriteAttributeOctetStringNotDefaultValueFromSavedValue_107();
            break;
        case 108:
            ChipLogProgress(
                chipTool, " ***** Test Step 108 : Read attribute octet_string Not Default Value and compare to expected value\n");
            err = TestReadAttributeOctetStringNotDefaultValueAndCompareToExpectedValue_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Write attribute octet_string Default Value\n");
            err = TestWriteAttributeOctetStringDefaultValue_109();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 110;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull TestAddArgumentDefaultValue;

    CHIP_ERROR TestSendTestAddArgumentsCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }
                                     {
                                         TestAddArgumentDefaultValue = values.returnValue;
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, TestAddArgumentDefaultValue));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     VerifyOrReturn(
                                         CheckConstraintNotValue("returnValue", values.returnValue, TestAddArgumentDefaultValue));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBooleanDefaultValue;

    CHIP_ERROR TestReadAttributeBooleanDefaultValue_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }
            {
                readAttributeBooleanDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanNotDefaultValue_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanNotDefaultValue_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("boolean", value, readAttributeBooleanDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanDefaultValue_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [readAttributeBooleanDefaultValue copy];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN DefaultValue Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanFalse_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN False Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, readAttributeBooleanDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap8DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }
            {
                readAttributeBitmap8DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8NotDefaultValue_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8NotDefaultValue_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap8", value, readAttributeBitmap8DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8DefaultValue_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [readAttributeBitmap8DefaultValue copy];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, readAttributeBitmap8DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap16DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }
            {
                readAttributeBitmap16DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16NotDefaultValue_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16NotDefaultValue_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap16", value, readAttributeBitmap16DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16DefaultValue_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [readAttributeBitmap16DefaultValue copy];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, readAttributeBitmap16DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap32DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }
            {
                readAttributeBitmap32DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32NotDefaultValue_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32NotDefaultValue_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap32", value, readAttributeBitmap32DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32DefaultValue_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [readAttributeBitmap32DefaultValue copy];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, readAttributeBitmap32DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap64DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }
            {
                readAttributeBitmap64DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64NotDefaultValue_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap64", value, readAttributeBitmap64DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64DefaultValue_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [readAttributeBitmap64DefaultValue copy];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, readAttributeBitmap64DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt8uDefaultValue;

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }
            {
                readAttributeInt8uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uNotDefaultValue_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uNotDefaultValue_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int8u", value, readAttributeInt8uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uDefaultValue_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [readAttributeInt8uDefaultValue copy];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, readAttributeInt8uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt16uDefaultValue;

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }
            {
                readAttributeInt16uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uNotDefaultValue_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uNotDefaultValue_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int16u", value, readAttributeInt16uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uDefaultValue_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [readAttributeInt16uDefaultValue copy];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, readAttributeInt16uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt32uDefaultValue;

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }
            {
                readAttributeInt32uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uNotDefaultValue_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uNotDefaultValue_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32u", value, readAttributeInt32uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uDefaultValue_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [readAttributeInt32uDefaultValue copy];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, readAttributeInt32uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt64uDefaultValue;

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }
            {
                readAttributeInt64uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uNotDefaultValue_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uNotDefaultValue_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int64u", value, readAttributeInt64uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uDefaultValue_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [readAttributeInt64uDefaultValue copy];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, readAttributeInt64uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt8sDefaultValue;

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }
            {
                readAttributeInt8sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sNotDefaultValue_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:1];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sNotDefaultValue_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int8s", value, readAttributeInt8sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sDefaultValue_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [readAttributeInt8sDefaultValue copy];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, readAttributeInt8sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt16sDefaultValue;

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }
            {
                readAttributeInt16sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sNotDefaultValue_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:1];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sNotDefaultValue_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int16s", value, readAttributeInt16sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sDefaultValue_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [readAttributeInt16sDefaultValue copy];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, readAttributeInt16sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt32sDefaultValue;

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_59()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }
            {
                readAttributeInt32sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sNotDefaultValue_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:1L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sNotDefaultValue_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32s", value, readAttributeInt32sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sDefaultValue_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [readAttributeInt32sDefaultValue copy];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, readAttributeInt32sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt64sDefaultValue;

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_64()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }
            {
                readAttributeInt64sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeIntsNotDefaultValue_65()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:1LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INTS Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sNotDefaultValue_66()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int64s", value, readAttributeInt64sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sDefaultValue_67()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [readAttributeInt64sDefaultValue copy];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, readAttributeInt64sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEnum8DefaultValue;

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }
            {
                readAttributeEnum8DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8NotDefaultValue_70()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8NotDefaultValue_71()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("enum8", value, readAttributeEnum8DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8DefaultValue_72()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [readAttributeEnum8DefaultValue copy];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_73()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, readAttributeEnum8DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEnum16DefaultValue;

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_74()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }
            {
                readAttributeEnum16DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16NotDefaultValue_75()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16NotDefaultValue_76()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("enum16", value, readAttributeEnum16DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16DefaultValue_77()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [readAttributeEnum16DefaultValue copy];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_78()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, readAttributeEnum16DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEpochUSDefaultValue;

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_79()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }
            {
                readAttributeEpochUSDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsNotDefaultValue_80()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsNotDefaultValue_81()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("epochUs", value, readAttributeEpochUSDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsDefaultValue_82()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [readAttributeEpochUSDefaultValue copy];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_83()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, readAttributeEpochUSDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEpochSDefaultValue;

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_84()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }
            {
                readAttributeEpochSDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSNotDefaultValue_85()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSNotDefaultValue_86()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("epochS", value, readAttributeEpochSDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSDefaultValue_87()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [readAttributeEpochSDefaultValue copy];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_88()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, readAttributeEpochSDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeVendorIdDefaultValue;

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_89()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 0U));
            }
            {
                readAttributeVendorIdDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorIdNotDefaultValue_90()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdNotDefaultValue_91()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("vendorId", value, readAttributeVendorIdDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorIdDefaultValue_92()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [readAttributeVendorIdDefaultValue copy];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_93()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, readAttributeVendorIdDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nonnull readAttributeCharStringDefaultValue;

    CHIP_ERROR TestReadAttributeCharStringDefaultValue_94()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @""));
            }
            {
                readAttributeCharStringDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringDefaultValueAndCompareToSavedValue_95()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, readAttributeCharStringDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringNotDefaultValue_96()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"NotDefault";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Not Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nonnull readAttributeCharStringNotDefaultValue;

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValue_97()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"NotDefault"));
            }

            VerifyOrReturn(CheckConstraintNotValue("charString", value, readAttributeCharStringDefaultValue));
            {
                readAttributeCharStringNotDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToSavedValue_98()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, readAttributeCharStringNotDefaultValue));
            }

            VerifyOrReturn(CheckConstraintNotValue("charString", value, readAttributeCharStringDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringNotDefaultValueFromSavedValue_99()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringNotDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Not Default Value from saved value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToExpectedValue_100()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value and compare to expected value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"NotDefault"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringDefaultValue_101()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nonnull readAttributeOctetStringDefaultValue;

    CHIP_ERROR TestReadAttributeOctetStringDefaultValue_102()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }
            {
                readAttributeOctetStringDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringDefaultValueAndCompareToSavedValue_103()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, readAttributeOctetStringDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValue_104()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"NotDefault" length:10];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute octet_string Not Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nonnull readAttributeOctetStringNotDefaultValue;

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValue_105()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"NotDefault" length:10]));
            }

            VerifyOrReturn(CheckConstraintNotValue("octetString", value, readAttributeOctetStringDefaultValue));
            {
                readAttributeOctetStringNotDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToSavedValue_106()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, readAttributeOctetStringNotDefaultValue));
            }

            VerifyOrReturn(CheckConstraintNotValue("octetString", value, readAttributeOctetStringDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValueFromSavedValue_107()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringNotDefaultValue copy];
        [cluster
            writeAttributeOctetStringWithValue:octetStringArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute octet_string Not Default Value from saved value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToExpectedValue_108()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value and compare to expected value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"NotDefault" length:10]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringDefaultValue_109()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringDefaultValue copy];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute octet_string Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }
};

class TestConfigVariables : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestConfigVariables()
        : TestCommandBridge("TestConfigVariables")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("arg1", 0, UINT8_MAX, &mArg1);
        AddArgument("returnValueWithArg1", 0, UINT8_MAX, &mReturnValueWithArg1);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestConfigVariables() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestConfigVariables\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestConfigVariables\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint8_t> mArg1;
    chip::Optional<uint8_t> mReturnValueWithArg1;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull TestAddArgumentDefaultValue;

    CHIP_ERROR TestSendTestAddArgumentsCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }
                                     {
                                         TestAddArgumentDefaultValue = values.returnValue;
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
                                                                                     endpointID:@(1)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = mArg1.HasValue() ? [NSNumber numberWithUnsignedChar:mArg1.Value()] : [NSNumber numberWithUnsignedChar:5U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue,
                                             mReturnValueWithArg1.HasValue() ? mReturnValueWithArg1.Value() : 25U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }
};

class TestDescriptorCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestDescriptorCluster()
        : TestCommandBridge("TestDescriptorCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestDescriptorCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestDescriptorCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestDescriptorCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Device list\n");
            err = TestReadAttributeDeviceList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute Server list\n");
            err = TestReadAttributeServerList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute Client list\n");
            err = TestReadAttributeClientList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute Parts list\n");
            err = TestReadAttributePartsList_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeDeviceList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDeviceTypeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Device list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DeviceTypeList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("type", ((MTRDescriptorClusterDeviceTypeStruct *) actualValue[0]).type, 22UL));
                VerifyOrReturn(CheckValue("revision", ((MTRDescriptorClusterDeviceTypeStruct *) actualValue[0]).revision, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeServerList_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Server list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ServerList", [actualValue count], static_cast<uint32_t>(27)));
                VerifyOrReturn(CheckValue("", actualValue[0], 3UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 29UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 30UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 31UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 40UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 42UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 43UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 44UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 45UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 46UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 47UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 48UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 49UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 50UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 51UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 52UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 53UL));
                VerifyOrReturn(CheckValue("", actualValue[18], 54UL));
                VerifyOrReturn(CheckValue("", actualValue[19], 55UL));
                VerifyOrReturn(CheckValue("", actualValue[20], 60UL));
                VerifyOrReturn(CheckValue("", actualValue[21], 62UL));
                VerifyOrReturn(CheckValue("", actualValue[22], 63UL));
                VerifyOrReturn(CheckValue("", actualValue[23], 64UL));
                VerifyOrReturn(CheckValue("", actualValue[24], 65UL));
                VerifyOrReturn(CheckValue("", actualValue[25], 1029UL));
                VerifyOrReturn(CheckValue("", actualValue[26], 4294048774UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeClientList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClientListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Client list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClientList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 41UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePartsList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                   endpointID:@(0)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePartsListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Parts list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PartsList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestBasicInformation : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestBasicInformation()
        : TestCommandBridge("TestBasicInformation")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestBasicInformation() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestBasicInformation\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestBasicInformation\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read location\n");
            err = TestReadLocation_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Write location\n");
            err = TestWriteLocation_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read back location\n");
            err = TestReadBackLocation_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Restore initial location value\n");
            err = TestRestoreInitialLocationValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read AttributeList value\n");
            err = TestReadAttributeListValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read NodeLabel\n");
            err = TestReadNodeLabel_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write NodeLabel\n");
            err = TestWriteNodeLabel_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read back NodeLabel\n");
            err = TestReadBackNodeLabel_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read LocalConfigDisabled\n");
            err = TestReadLocalConfigDisabled_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Write LocalConfigDisabled\n");
            err = TestWriteLocalConfigDisabled_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read back LocalConfigDisabled\n");
            err = TestReadBackLocalConfigDisabled_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reboot the device\n");
            err = TestRebootTheDevice_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Connect to the device again\n");
            err = TestConnectToTheDeviceAgain_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read back NodeLabel after reboot\n");
            err = TestReadBackNodeLabelAfterReboot_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Restore initial NodeLabel value\n");
            err = TestRestoreInitialNodeLabelValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read back LocalConfigDisabled after reboot\n");
            err = TestReadBackLocalConfigDisabledAfterReboot_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Restore initial LocalConfigDisabled value\n");
            err = TestRestoreInitialLocalConfigDisabledValue_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadLocation_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read location Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Location", actualValue, @"XX"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteLocation_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"US";
        [cluster writeAttributeLocationWithValue:locationArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write location Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocation_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back location Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Location", actualValue, @"US"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialLocationValue_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"XX";
        [cluster writeAttributeLocationWithValue:locationArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Restore initial location value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListValue_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AttributeList value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AttributeList", [actualValue count], static_cast<uint32_t>(25)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 2UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 3UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 5UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 6UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 7UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 11UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 12UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 13UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 14UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 15UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 16UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 17UL));
                VerifyOrReturn(CheckValue("", actualValue[18], 18UL));
                VerifyOrReturn(CheckValue("", actualValue[19], 19UL));
                VerifyOrReturn(CheckValue("", actualValue[20], 65528UL));
                VerifyOrReturn(CheckValue("", actualValue[21], 65529UL));
                VerifyOrReturn(CheckValue("", actualValue[22], 65531UL));
                VerifyOrReturn(CheckValue("", actualValue[23], 65532UL));
                VerifyOrReturn(CheckValue("", actualValue[24], 65533UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNodeLabel_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read NodeLabel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNodeLabel_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"My node";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write NodeLabel Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackNodeLabel_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back NodeLabel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @"My node"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLocalConfigDisabled_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LocalConfigDisabled Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteLocalConfigDisabled_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write LocalConfigDisabled Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocalConfigDisabled_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back LocalConfigDisabled Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTheDevice_12()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestConnectToTheDeviceAgain_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadBackNodeLabelAfterReboot_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back NodeLabel after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @"My node"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialNodeLabelValue_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Restore initial NodeLabel value Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocalConfigDisabledAfterReboot_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back LocalConfigDisabled after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialLocalConfigDisabledValue_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Restore initial LocalConfigDisabled value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }
};

class TestFabricRemovalWhileSubscribed : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestFabricRemovalWhileSubscribed()
        : TestCommandBridge("TestFabricRemovalWhileSubscribed")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestFabricRemovalWhileSubscribed() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestFabricRemovalWhileSubscribed\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestFabricRemovalWhileSubscribed\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Open commissioning window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Commission from beta\n");
            err = TestCommissionFromBeta_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Report: Subscribe Fabrics Attribute from beta\n");
            err = TestReportSubscribeFabricsAttributeFromBeta_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Subscribe Fabrics Attribute from beta\n");
            err = TestSubscribeFabricsAttributeFromBeta_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Remove single own fabric\n");
            err = TestRemoveSingleOwnFabric_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CommissionedFabrics", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open commissioning window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_4()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = 74565ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 74565ULL;
        return WaitForCommissionee("beta", value);
    }
    bool testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = nil;

    CHIP_ERROR TestReportSubscribeFabricsAttributeFromBeta_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe Fabrics Attribute from beta Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("fabrics", "list", "list"));
            testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeFabricsAttributeFromBeta_7()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeFabricsWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled,
                    SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe Fabrics Attribute from beta Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestFabricRemovalWhileSubscribed_Fabrics_Reported != nil) {
                    ResponseHandler callback = test_TestFabricRemovalWhileSubscribed_Fabrics_Reported;
                    test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSingleOwnFabric_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove single own fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
};

class TestGeneralCommissioning : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGeneralCommissioning()
        : TestCommandBridge("TestGeneralCommissioning")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGeneralCommissioning() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGeneralCommissioning\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGeneralCommissioning\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write Breadcrumb (1/2)\n");
            err = TestWriteBreadcrumb12_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read back Breadcrumb (1/2)\n");
            err = TestReadBackBreadcrumb12_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write Breadcrumb (2/2)\n");
            err = TestWriteBreadcrumb22_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read back Breadcrumb (2/2)\n");
            err = TestReadBackBreadcrumb22_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reboot to reset Breadcrumb\n");
            err = TestRebootToResetBreadcrumb_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Connect to the device again\n");
            err = TestConnectToTheDeviceAgain_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read back Breadcrumb after reboot and ensure it was not persisted\n");
            err = TestReadBackBreadcrumbAfterRebootAndEnsureItWasNotPersisted_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Set Breadcrumb to nonzero value\n");
            err = TestSetBreadcrumbToNonzeroValue_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Check Breadcrumb set worked\n");
            err = TestCheckBreadcrumbSetWorked_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Send CommissioningComplete without armed fail-safe\n");
            err = TestSendCommissioningCompleteWithoutArmedFailSafe_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Check Breadcrumb was not touched by invalid CommissioningComplete\n");
            err = TestCheckBreadcrumbWasNotTouchedByInvalidCommissioningComplete_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Try to arm fail-safe\n");
            err = TestTryToArmFailSafe_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : Check Breadcrumb was not touched by ArmFailSafe with commissioning window open\n");
            err = TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithCommissioningWindowOpen_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reset Breadcrumb to 0 so we can commission\n");
            err = TestResetBreadcrumbTo0SoWeCanCommission_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Commission from beta\n");
            err = TestCommissionFromBeta_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Arm fail-safe\n");
            err = TestArmFailSafe_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Check Breadcrumb was properly set by ArmFailSafe\n");
            err = TestCheckBreadcrumbWasProperlySetByArmFailSafe_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Try to arm fail-safe from wrong fabric\n");
            err = TestTryToArmFailSafeFromWrongFabric_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed\n");
            err = TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithExistingFailSafeArmed_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Send CommissioningComplete from wrong fabric\n");
            err = TestSendCommissioningCompleteFromWrongFabric_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Check Breadcrumb was not touched by CommissioningComplete from wrong fabric\n");
            err = TestCheckBreadcrumbWasNotTouchedByCommissioningCompleteFromWrongFabric_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Close out the fail-safe gracefully\n");
            err = TestCloseOutTheFailSafeGracefully_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Check Breadcrumb was reset to 0 by CommissioningComplete\n");
            err = TestCheckBreadcrumbWasResetTo0ByCommissioningComplete_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Arm fail-safe again\n");
            err = TestArmFailSafeAgain_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Check Breadcrumb was set by arming fail-safe again\n");
            err = TestCheckBreadcrumbWasSetByArmingFailSafeAgain_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Force-expire the fail-safe\n");
            err = TestForceExpireTheFailSafe_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Check Breadcrumb was reset by expiring the fail-safe\n");
            err = TestCheckBreadcrumbWasResetByExpiringTheFailSafe_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Validate presence of SupportsConcurrentConnection\n");
            err = TestValidatePresenceOfSupportsConcurrentConnection_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteBreadcrumb12_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:137438953472ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write Breadcrumb (1/2) Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackBreadcrumb12_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb (1/2) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 137438953472ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBreadcrumb22_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:81ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write Breadcrumb (2/2) Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackBreadcrumb22_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb (2/2) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 81ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootToResetBreadcrumb_5()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestConnectToTheDeviceAgain_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadBackBreadcrumbAfterRebootAndEnsureItWasNotPersisted_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb after reboot and ensure it was not persisted Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetBreadcrumbToNonzeroValue_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Set Breadcrumb to nonzero value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbSetWorked_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb set worked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendCommissioningCompleteWithoutArmedFailSafe_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send CommissioningComplete without armed fail-safe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("errorCode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByInvalidCommissioningComplete_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by invalid CommissioningComplete Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToArmFailSafe_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:10U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:5000ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Try to arm fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithCommissioningWindowOpen_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by ArmFailSafe with commissioning window open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestResetBreadcrumbTo0SoWeCanCommission_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Reset Breadcrumb to 0 so we can commission Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_16()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = 74565ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 74565ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestArmFailSafe_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:500U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:2ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Arm fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasProperlySetByArmFailSafe_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was properly set by ArmFailSafe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToArmFailSafeFromWrongFabric_20()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:10U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:5000ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Try to arm fail-safe from wrong fabric Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithExistingFailSafeArmed_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendCommissioningCompleteFromWrongFabric_22()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send CommissioningComplete from wrong fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("errorCode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByCommissioningCompleteFromWrongFabric_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by CommissioningComplete from wrong fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseOutTheFailSafeGracefully_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Close out the fail-safe gracefully Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("errorCode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasResetTo0ByCommissioningComplete_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was reset to 0 by CommissioningComplete Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestArmFailSafeAgain_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:500U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:3ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Arm fail-safe again Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasSetByArmingFailSafeAgain_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was set by arming fail-safe again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 3ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestForceExpireTheFailSafe_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:0U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:4ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Force-expire the fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasResetByExpiringTheFailSafe_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was reset by expiring the fail-safe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidatePresenceOfSupportsConcurrentConnection_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Validate presence of SupportsConcurrentConnection Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportsConcurrentConnection", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestIdentifyCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestIdentifyCluster()
        : TestCommandBridge("TestIdentifyCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestIdentifyCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestIdentifyCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestIdentifyCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Identify command and expect success response\n");
            err = TestSendIdentifyCommandAndExpectSuccessResponse_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendIdentifyCommandAndExpectSuccessResponse_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster identifyWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Send Identify command and expect success response Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
};

class TestOperationalCredentialsCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestOperationalCredentialsCluster()
        : TestCommandBridge("TestOperationalCredentialsCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestOperationalCredentialsCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestOperationalCredentialsCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestOperationalCredentialsCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of supported fabrics\n");
            err = TestReadNumberOfSupportedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Remove nonexistent fabric\n");
            err = TestRemoveNonexistentFabric_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read fabric list before setting label\n");
            err = TestReadFabricListBeforeSettingLabel_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Set the fabric label\n");
            err = TestSetTheFabricLabel_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read fabric list after setting label\n");
            err = TestReadFabricListAfterSettingLabel_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfSupportedFabrics_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of supported fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportedFabrics", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("supportedFabrics", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("commissionedFabrics", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveNonexistentFabric_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [NSNumber numberWithUnsignedChar:243U];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove nonexistent fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 {
                                     id actualValue = values.statusCode;
                                     VerifyOrReturn(CheckValue("StatusCode", actualValue, 11U));
                                 }

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFabricListBeforeSettingLabel_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read fabric list before setting label Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(CheckValueAsString("Label",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label, @""));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).fabricIndex,
                                                 ourFabricIndex));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheFabricLabel_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterUpdateFabricLabelParams alloc] init];
        params.label = @"Batcave";
        [cluster updateFabricLabelWithParams:params
                                  completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values,
                                      NSError * _Nullable err) {
                                      NSLog(@"Set the fabric label Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = values.statusCode;
                                          VerifyOrReturn(CheckValue("StatusCode", actualValue, 0U));
                                      }

                                      {
                                          id actualValue = values.fabricIndex;
                                          VerifyOrReturn(CheckValue("FabricIndex", actualValue, ourFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFabricListAfterSettingLabel_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read fabric list after setting label Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(CheckValueAsString("Label",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label,
                                                 @"Batcave"));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).fabricIndex,
                                                 ourFabricIndex));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }
};

class TestModeSelectCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestModeSelectCluster()
        : TestCommandBridge("TestModeSelectCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestModeSelectCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestModeSelectCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestModeSelectCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read Description\n");
            err = TestReadDescription_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read StandardNamespace\n");
            err = TestReadStandardNamespace_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read SupportedModes\n");
            err = TestReadSupportedModes_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read CurrentMode\n");
            err = TestReadCurrentMode_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read StartUpMode\n");
            err = TestReadStartUpMode_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read OnMode\n");
            err = TestReadOnMode_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Change to Supported Mode\n");
            err = TestChangeToSupportedMode_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify Current Mode Change\n");
            err = TestVerifyCurrentModeChange_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Change to Unsupported Mode\n");
            err = TestChangeToUnsupportedMode_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Toggle OnOff\n");
            err = TestToggleOnOff_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Toggle OnOff\n");
            err = TestToggleOnOff_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Verify Current Mode does not change when OnMode is null\n");
            err = TestVerifyCurrentModeDoesNotChangeWhenOnModeIsNull_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Change to Unsupported OnMode\n");
            err = TestChangeToUnsupportedOnMode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Change OnMode\n");
            err = TestChangeOnMode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Verify OnMode\n");
            err = TestVerifyOnMode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Toggle OnOff\n");
            err = TestToggleOnOff_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Toggle OnOff\n");
            err = TestToggleOnOff_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Verify Current Mode Changes if OnMode is not null\n");
            err = TestVerifyCurrentModeChangesIfOnModeIsNotNull_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Change to Unsupported StartUp Mode\n");
            err = TestChangeToUnsupportedStartUpMode_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Change to Supported StartUp Mode\n");
            err = TestChangeToSupportedStartUpMode_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Verify StartUp Mode Change\n");
            err = TestVerifyStartUpModeChange_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Change CurrentMode to another value\n");
            err = TestChangeCurrentModeToAnotherValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Change On Mode\n");
            err = TestChangeOnMode_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Set StartUpOnOff\n");
            err = TestSetStartUpOnOff_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Reboot target device\n");
            err = TestRebootTargetDevice_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_26();
            break;
        case 27:
            ChipLogProgress(
                chipTool, " ***** Test Step 27 : Verify Current Mode Change based on OnMode, as it overwrites StartUpMode\n");
            err = TestVerifyCurrentModeChangeBasedOnOnModeAsItOverwritesStartUpMode_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Change On Mode to Null\n");
            err = TestChangeOnModeToNull_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Reboot target device\n");
            err = TestRebootTargetDevice_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Verify Current Mode Change based on new StartUp Mode\n");
            err = TestVerifyCurrentModeChangeBasedOnNewStartUpMode_31();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 32;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadDescription_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read Description Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Description", actualValue, @"Coffee"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStandardNamespace_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStandardNamespaceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read StandardNamespace Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StandardNamespace", actualValue));
                VerifyOrReturn(CheckValue("StandardNamespace", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadSupportedModes_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedModesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read SupportedModes Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SupportedModes", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).label, @"Black"));
                VerifyOrReturn(CheckValue("Mode", ((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).mode, 0U));
                VerifyOrReturn(CheckValue("SemanticTags",
                    [((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).semanticTags count], static_cast<uint32_t>(1)));
                VerifyOrReturn(
                    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
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CurrentMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStartUpMode_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read StartUpMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpMode", actualValue));
                VerifyOrReturn(CheckValue("StartUpMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOnMode_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("OnMode", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToSupportedMode_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:4U];
        [cluster changeToModeWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Change to Supported Mode Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull currentModeBeforeToggle;

    CHIP_ERROR TestVerifyCurrentModeChange_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 4U));
            }
            {
                currentModeBeforeToggle = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedMode_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            changeToModeWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Change to Unsupported Mode Error: %@", err);

                            VerifyOrReturn(CheckValue("status",
                                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                    : 0,
                                EMBER_ZCL_STATUS_INVALID_COMMAND));
                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCurrentModeDoesNotChangeWhenOnModeIsNull_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode does not change when OnMode is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, currentModeBeforeToggle));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedOnMode_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            writeAttributeOnModeWithValue:onModeArgument
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"Change to Unsupported OnMode Error: %@", err);

                                   VerifyOrReturn(CheckValue("status",
                                       err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                           : 0,
                                       EMBER_ZCL_STATUS_INVALID_COMMAND));
                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnMode_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change OnMode Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnModeValue;

    CHIP_ERROR TestVerifyOnMode_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify OnMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnMode", actualValue));
                VerifyOrReturn(CheckValue("OnMode", actualValue, 7U));
            }
            {
                OnModeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCurrentModeChangesIfOnModeIsNotNull_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Changes if OnMode is not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, OnModeValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedStartUpMode_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Change to Unsupported StartUp Mode Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_INVALID_COMMAND));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToSupportedStartUpMode_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Change to Supported StartUp Mode Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyStartUpModeChange_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify StartUp Mode Change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpMode", actualValue));
                VerifyOrReturn(CheckValue("StartUpMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeCurrentModeToAnotherValue_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster changeToModeWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Change CurrentMode to another value Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnMode_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change On Mode Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetStartUpOnOff_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Set StartUpOnOff Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_25()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_26()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyCurrentModeChangeBasedOnOnModeAsItOverwritesStartUpMode_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change based on OnMode, as it overwrites StartUpMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnModeToNull_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = nil;
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change On Mode to Null Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_29()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_30()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyCurrentModeChangeBasedOnNewStartUpMode_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change based on new StartUp Mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestSelfFabricRemoval : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSelfFabricRemoval()
        : TestCommandBridge("TestSelfFabricRemoval")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSelfFabricRemoval() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSelfFabricRemoval\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSelfFabricRemoval\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Remove single own fabric\n");
            err = TestRemoveSingleOwnFabric_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CommissionedFabrics", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSingleOwnFabric_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove single own fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
};

class TestSystemCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSystemCommands()
        : TestCommandBridge("TestSystemCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSystemCommands() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSystemCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSystemCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Start the default accessory with no command line options\n");
            err = TestStartTheDefaultAccessoryWithNoCommandLineOptions_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Stop the default accessory by key\n");
            err = TestStopTheDefaultAccessoryByKey_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Start the default accessory with discriminator command line option\n");
            err = TestStartTheDefaultAccessoryWithDiscriminatorCommandLineOption_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Start the default accessory with discriminator and port command line options\n");
            err = TestStartTheDefaultAccessoryWithDiscriminatorAndPortCommandLineOptions_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Start the default accessory with minCommissioningTimeout only\n");
            err = TestStartTheDefaultAccessoryWithMinCommissioningTimeoutOnly_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Start the default accessory by key with all command line options\n");
            err = TestStartTheDefaultAccessoryByKeyWithAllCommandLineOptions_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Start a second accessory with all command line options\n");
            err = TestStartASecondAccessoryWithAllCommandLineOptions_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Commission second accessory from alpha\n");
            err = TestCommissionSecondAccessoryFromAlpha_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait for the second commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheSecondCommissionedDeviceToBeRetrievedForAlpha_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Stop the second accessory\n");
            err = TestStopTheSecondAccessory_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Start a second accessory with different KVS\n");
            err = TestStartASecondAccessoryWithDifferentKvs_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reboot the default accessory\n");
            err = TestRebootTheDefaultAccessory_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reboot the default accessory by key\n");
            err = TestRebootTheDefaultAccessoryByKey_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reboot the second accessory\n");
            err = TestRebootTheSecondAccessory_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Factory Reset the default accessory\n");
            err = TestFactoryResetTheDefaultAccessory_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Factory Reset the default accessory by key\n");
            err = TestFactoryResetTheDefaultAccessoryByKey_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Factory Reset the second accessory\n");
            err = TestFactoryResetTheSecondAccessory_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_1()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithNoCommandLineOptions_2()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessoryByKey_3()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorCommandLineOption_4()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = 1111U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_5()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorAndPortCommandLineOptions_6()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = 1111U;
        value.port.Emplace();
        value.port.Value() = 5560U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_7()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithMinCommissioningTimeoutOnly_8()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.minCommissioningTimeout.Emplace();
        value.minCommissioningTimeout.Value() = 10U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_9()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryByKeyWithAllCommandLineOptions_10()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
        value.discriminator.Emplace();
        value.discriminator.Value() = 1111U;
        value.port.Emplace();
        value.port.Value() = 5560U;
        value.kvs.Emplace();
        value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_defaultgarbage: not in length on purpose", 21);
        value.minCommissioningTimeout.Emplace();
        value.minCommissioningTimeout.Value() = 10U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStartASecondAccessoryWithAllCommandLineOptions_11()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
        value.discriminator.Emplace();
        value.discriminator.Value() = 50U;
        value.port.Emplace();
        value.port.Value() = 5561U;
        value.kvs.Emplace();
        value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lockgarbage: not in length on purpose", 18);
        return Start("alpha", value);
    }

    CHIP_ERROR TestCommissionSecondAccessoryFromAlpha_12()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = 3735928559ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
        return PairWithCode("alpha", value);
    }

    CHIP_ERROR TestWaitForTheSecondCommissionedDeviceToBeRetrievedForAlpha_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 3735928559ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestStopTheSecondAccessory_14()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartASecondAccessoryWithDifferentKvs_15()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
        value.discriminator.Emplace();
        value.discriminator.Value() = 50U;
        value.port.Emplace();
        value.port.Value() = 5561U;
        value.kvs.Emplace();
        value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lock2garbage: not in length on purpose", 19);
        return Start("alpha", value);
    }

    CHIP_ERROR TestRebootTheDefaultAccessory_16()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTheDefaultAccessoryByKey_17()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTheSecondAccessory_18()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheDefaultAccessory_19()
    {
        chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
        return FactoryReset("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheDefaultAccessoryByKey_20()
    {
        chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
        return FactoryReset("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheSecondAccessory_21()
    {
        chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
        value.registerKey.Emplace();
        value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
        return FactoryReset("alpha", value);
    }
};

class TestBinding : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestBinding()
        : TestCommandBridge("TestBinding")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestBinding() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestBinding\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestBinding\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write empty binding table\n");
            err = TestWriteEmptyBindingTable_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read empty binding table\n");
            err = TestReadEmptyBindingTable_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write invalid binding table\n");
            err = TestWriteInvalidBindingTable_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write binding table (endpoint 1)\n");
            err = TestWriteBindingTableEndpoint1_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read binding table (endpoint 1)\n");
            err = TestReadBindingTableEndpoint1_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write binding table (endpoint 0)\n");
            err = TestWriteBindingTableEndpoint0_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read binding table (endpoint 0)\n");
            err = TestReadBindingTableEndpoint0_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify endpoint 1 not changed\n");
            err = TestVerifyEndpoint1NotChanged_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteEmptyBindingTable_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write empty binding table Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadEmptyBindingTable_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read empty binding table Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(0)));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteInvalidBindingTable_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).node = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).group = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).cluster = [NSNumber numberWithUnsignedInt:6UL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster
            writeAttributeBindingWithValue:bindingArgument
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Write invalid binding table Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBindingTableEndpoint1_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).group = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).node = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).cluster = [NSNumber numberWithUnsignedInt:6UL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[2] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).node = [NSNumber numberWithUnsignedLongLong:2ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write binding table (endpoint 1) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBindingTableEndpoint1_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read binding table (endpoint 1) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(3)));
                                             VerifyOrReturn(
                                                 CheckValue("Group", ((MTRBindingClusterTargetStruct *) actualValue[0]).group, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[1]).node, 1ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[1]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue(
                                                 "Cluster", ((MTRBindingClusterTargetStruct *) actualValue[1]).cluster, 6UL));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[1]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[2]).node, 2ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[2]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[2]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBindingTableEndpoint0_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(0)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).node = [NSNumber numberWithUnsignedLongLong:3ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write binding table (endpoint 0) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBindingTableEndpoint0_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(0)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read binding table (endpoint 0) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[0]).node, 3ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[0]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyEndpoint1NotChanged_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
                                                                             endpointID:@(1)
                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Verify endpoint 1 not changed Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(3)));
                                             VerifyOrReturn(
                                                 CheckValue("Group", ((MTRBindingClusterTargetStruct *) actualValue[0]).group, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[1]).node, 1ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[1]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue(
                                                 "Cluster", ((MTRBindingClusterTargetStruct *) actualValue[1]).cluster, 6UL));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[1]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[2]).node, 2ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[2]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[2]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }
};

class TestUserLabelCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestUserLabelCluster()
        : TestCommandBridge("TestUserLabelCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestUserLabelCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestUserLabelCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestUserLabelCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Commit User Label List\n");
            err = TestCommitUserLabelList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify committed User Label List\n");
            err = TestVerifyCommittedUserLabelList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Clear User Label List\n");
            err = TestClearUserLabelList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read User Label List\n");
            err = TestReadUserLabelList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write User Label List\n");
            err = TestWriteUserLabelList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reboot target device\n");
            err = TestRebootTargetDevice_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify User Label List after reboot\n");
            err = TestVerifyUserLabelListAfterReboot_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCommitUserLabelList_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"South";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"2";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"direction";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"down";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Commit User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCommittedUserLabelList_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify committed User Label List Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"orientation"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"South"));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"2"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"direction"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"down"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserLabelList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Clear User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUserLabelList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read User Label List Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(0)));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteUserLabelList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 2";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"North";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"5";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"direction";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"up";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_6()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyUserLabelListAfterReboot_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify User Label List after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("label list", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 2"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"orientation"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"North"));
                VerifyOrReturn(CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"5"));
                VerifyOrReturn(
                    CheckValueAsString("label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"direction"));
                VerifyOrReturn(CheckValueAsString("value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"up"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestUserLabelClusterConstraints()
        : TestCommandBridge("TestUserLabelClusterConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestUserLabelClusterConstraints() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestUserLabelClusterConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestUserLabelClusterConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Attempt to write overly long item for label\n");
            err = TestAttemptToWriteOverlyLongItemForLabel_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Attempt to write overly long item for value\n");
            err = TestAttemptToWriteOverlyLongItemForValue_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestAttemptToWriteOverlyLongItemForLabel_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"this is longer than sixteen characters";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 2";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Attempt to write overly long item for label Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAttemptToWriteOverlyLongItemForValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
                                                                                 endpointID:@(0)
                                                                                      queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"test";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"this is longer than sixteen characters";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Attempt to write overly long item for value Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
};

class TestArmFailSafe : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestArmFailSafe()
        : TestCommandBridge("TestArmFailSafe")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestArmFailSafe() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestArmFailSafe\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestArmFailSafe\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Reboot target device\n");
            err = TestRebootTargetDevice_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Wait for the alpha device to be retrieved \n");
            err = TestWaitForTheAlphaDeviceToBeRetrieved_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Query fabrics list\n");
            err = TestQueryFabricsList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : ArmFailSafe on target device with timeout 0\n");
            err = TestArmFailSafeOnTargetDeviceWithTimeout0_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads NodeLabel mandatory attribute of target device\n");
            err = TestReadsNodeLabelMandatoryAttributeOfTargetDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Invoke AddTrustedRootCertificate without fail-safe\n");
            err = TestInvokeAddTrustedRootCertificateWithoutFailSafe_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Invoke AddNOC without fail-safe\n");
            err = TestInvokeAddNOCWithoutFailSafe_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Invoke UpdateNOC without fail-safe\n");
            err = TestInvokeUpdateNOCWithoutFailSafe_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Invoke CSRRequest without fail-safe\n");
            err = TestInvokeCSRRequestWithoutFailSafe_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestRebootTargetDevice_0()
    {
        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheAlphaDeviceToBeRetrieved_1()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestQueryFabricsList_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Query fabrics list Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(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
                                                                                                       endpointID:@(0)
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:0U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"ArmFailSafe on target device with timeout 0 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("errorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsNodeLabelMandatoryAttributeOfTargetDevice_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads NodeLabel mandatory attribute of target device Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeAddTrustedRootCertificateWithoutFailSafe_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterAddTrustedRootCertificateParams alloc] init];
        params.rootCertificate = [[NSData alloc] initWithBytes:"00000000" length:8];
        [cluster addTrustedRootCertificateWithParams:params
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Invoke AddTrustedRootCertificate without fail-safe Error: %@", err);

                                              VerifyOrReturn(CheckValue("status",
                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                          ? err.code
                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                      : 0,
                                                  EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeAddNOCWithoutFailSafe_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterAddNOCParams alloc] init];
        params.nocValue = [[NSData alloc] initWithBytes:"00112233" length:8];
        params.ipkValue = [[NSData alloc] initWithBytes:"\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007"
                                                 length:16];
        params.caseAdminSubject = [NSNumber numberWithUnsignedLongLong:1234ULL];
        params.adminVendorId = [NSNumber numberWithUnsignedShort:65521U];
        [cluster
            addNOCWithParams:params
                  completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                      NSLog(@"Invoke AddNOC without fail-safe Error: %@", err);

                      VerifyOrReturn(CheckValue("status",
                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                          EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeUpdateNOCWithoutFailSafe_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterUpdateNOCParams alloc] init];
        params.nocValue = [[NSData alloc] initWithBytes:"00112233" length:8];
        [cluster
            updateNOCWithParams:params
                     completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Invoke UpdateNOC without fail-safe Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeCSRRequestWithoutFailSafe_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterCSRRequestParams alloc] init];
        params.csrNonce = [[NSData alloc] initWithBytes:"\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007\000\001"
                                                        "\002\003\004\005\006\007\000\001\002\003\004\005\006\007"
                                                 length:32];
        [cluster
            CSRRequestWithParams:params
                      completion:^(MTROperationalCredentialsClusterCSRResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"Invoke CSRRequest without fail-safe Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }
};

class TestFanControl : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestFanControl()
        : TestCommandBridge("TestFanControl")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestFanControl() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestFanControl\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestFanControl\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write fan mode\n");
            err = TestWriteFanMode_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read back fan mode\n");
            err = TestReadBackFanMode_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write fan mode sequence\n");
            err = TestWriteFanModeSequence_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read back fan mode sequence\n");
            err = TestReadBackFanModeSequence_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write percent setting\n");
            err = TestWritePercentSetting_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read back percent setting\n");
            err = TestReadBackPercentSetting_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read back speed current\n");
            err = TestReadBackSpeedCurrent_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write percent setting\n");
            err = TestWritePercentSetting_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read back percent setting\n");
            err = TestReadBackPercentSetting_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write speed setting\n");
            err = TestWriteSpeedSetting_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read back percent setting\n");
            err = TestReadBackPercentSetting_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read back percent current\n");
            err = TestReadBackPercentCurrent_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write speed setting\n");
            err = TestWriteSpeedSetting_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write fan mode\n");
            err = TestWriteFanMode_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read back percent setting\n");
            err = TestReadBackPercentSetting_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read back percent current\n");
            err = TestReadBackPercentCurrent_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read back speed current\n");
            err = TestReadBackSpeedCurrent_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write fan mode\n");
            err = TestWriteFanMode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read back percent setting\n");
            err = TestReadBackPercentSetting_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_24();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 25;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteFanMode_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackFanMode_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back fan mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("fan mode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanModeSequence_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeSequenceArgument;
        fanModeSequenceArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeSequenceWithValue:fanModeSequenceArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write fan mode sequence Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackFanModeSequence_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeSequenceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back fan mode sequence Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("fan mode sequence", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = [NSNumber numberWithUnsignedChar:84U];
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write percent setting Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("speed current", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = nil;
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write percent setting Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = [NSNumber numberWithUnsignedChar:73U];
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Write speed setting Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("percent current", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = nil;
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Write speed setting Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("percent current", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("speed current", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("percent setting", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                   endpointID:@(1)
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("speed setting", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestAccessControlConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestAccessControlConstraints()
        : TestCommandBridge("TestAccessControlConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestAccessControlConstraints() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestAccessControlConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestAccessControlConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Constraint error: PASE reserved for future (TC-ACL-2.4 step 29)\n");
            err = TestConstraintErrorPaseReservedForFutureTcAcl24Step29_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31)\n");
            err = TestConstraintErrorInvalidCombinationAdministerGroupTcAcl24Step31_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33)\n");
            err = TestConstraintErrorInvalidAuthModeTcAcl24Step33_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Constraint error:  Invalid subject (TC-ACL-2.4 step 34)\n");
            err = TestConstraintErrorInvalidSubjectTcAcl24Step34_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Constraint error:  Invalid target (TC-ACL-2.4 step 38)\n");
            err = TestConstraintErrorInvalidTargetTcAcl24Step38_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42)\n");
            err = TestConstraintErrorTargetHasBothEndpointAndDeviceTypeTcAcl24Step42_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Constraint error: Invalid privilege value step 32)\n");
            err = TestConstraintErrorInvalidPrivilegeValueStep32_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFfffFfffFfffTcAcl24Step35_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFffd00000000TcAcl24Step36_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFfffFfff0000TcAcl24Step37_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestConstraintErrorPaseReservedForFutureTcAcl24Step29_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:1U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error: PASE reserved for future (TC-ACL-2.4 step 29) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidCombinationAdministerGroupTcAcl24Step31_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeAclWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidAuthModeTcAcl24Step33_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:4U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubjectTcAcl24Step34_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:0ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid subject (TC-ACL-2.4 step 34) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidTargetTcAcl24Step38_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid target (TC-ACL-2.4 step 38) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorTargetHasBothEndpointAndDeviceTypeTcAcl24Step42_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:22U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = [NSNumber numberWithUnsignedInt:33UL];

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeAclWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidPrivilegeValueStep32_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:6U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeAclWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error: Invalid privilege value step 32) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfffFfffTcAcl24Step35_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeAclWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFffd00000000TcAcl24Step36_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744060824649728ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeAclWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfff0000TcAcl24Step37_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                         endpointID:@(0)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709486080ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeAclWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }
};

class TestLevelControlWithOnOffDependency : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestLevelControlWithOnOffDependency()
        : TestCommandBridge("TestLevelControlWithOnOffDependency")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestLevelControlWithOnOffDependency() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestLevelControlWithOnOffDependency\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestLevelControlWithOnOffDependency\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Sends a MoveToLevel command to set CurrentLevel to min value\n");
            err = TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Wait 100 ms\n");
            err = TestWait100Ms_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads CurrentLevel attribute from DUT\n");
            err = TestReadsCurrentLevelAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write OnOffTransitionTime attribute\n");
            err = TestWriteOnOffTransitionTimeAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait 100 ms\n");
            err = TestWait100Ms_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read OnOffTransitionTime attribute\n");
            err = TestReadOnOffTransitionTimeAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write OnLevel attribute\n");
            err = TestWriteOnLevelAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 100 ms\n");
            err = TestWait100Ms_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read OnLevel attribute\n");
            err = TestReadOnLevelAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read MinValue attribute\n");
            err = TestReadMinValueAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Send On Command\n");
            err = TestSendOnCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Check on/off attribute value is true after on command\n");
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : If OnLevel is defined, check CurrentLevel is OnLevel value\n");
            err = TestIfOnLevelIsDefinedCheckCurrentLevelIsOnLevelValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Send Off Command\n");
            err = TestSendOffCommand_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Check on/off attribute value is false after off command\n");
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : If OnLevel is defined, check CurrentLevel is min value\n");
            err = TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Sends a MoveToLevel command to set CurrentLevel to a mid value\n");
            err = TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 100 ms\n");
            err = TestWait100Ms_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Reads CurrentLevel attribute from DUT\n");
            err = TestReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Set OnLevel attribute to null\n");
            err = TestSetOnLevelAttributeToNull_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Wait 100 ms\n");
            err = TestWait100Ms_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read OnLevel attribute\n");
            err = TestReadOnLevelAttribute_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Send On Command\n");
            err = TestSendOnCommand_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Check on/off attribute value is true after on command\n");
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : If OnLevel is not defined, check CurrentLevel is restored\n");
            err = TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Send Off Command\n");
            err = TestSendOffCommand_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : If OnLevel is not defined, check CurrentLevel is restored\n");
            err = TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_32();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 33;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:1U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a MoveToLevel command to set CurrentLevel to min value Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteOnOffTransitionTimeAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write OnOffTransitionTime attribute Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_5()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnOffTransitionTimeAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnOffTransitionTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteOnLevelAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write OnLevel attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnLevelAttribute_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
                VerifyOrReturn(CheckValue("OnLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMinValueAttribute_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read MinValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsOnLevelValue_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is defined, check CurrentLevel is OnLevel value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 0UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is defined, check CurrentLevel is min value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:127U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a MoveToLevel command to set CurrentLevel to a mid value Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_20()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOnLevelAttributeToNull_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = nil;
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Set OnLevel attribute to null Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_23()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnLevelAttribute_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("OnLevel", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_27()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is not defined, check CurrentLevel is restored Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_31()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 0UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is not defined, check CurrentLevel is restored Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCommissioningWindow : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCommissioningWindow()
        : TestCommandBridge("TestCommissioningWindow")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("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 endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get alpha's fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                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 endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is not open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndex_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminVendorId_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminVendorId Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsOpen_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndex_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                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 endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId is not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("adminVendorId", value));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindow_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close Commissioning Window Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsAgainNotOpen_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is again not open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatAgainThereIsNoAdminFabricIndex_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that again there is no AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatAgainThereIsNoAdminVendorId_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that again there is no AdminVendorId Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha again Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_14()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpenForTheThirdTime_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is not open for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndexForTheThirdTime_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminFabricIndex for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminVendorIdForTheThirdTime_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminVendorId for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetBetasFabricIndex_19()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get beta's fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                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 endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from beta Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsOpenAgain_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is open again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndexAgain_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                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 endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId is not null again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
            {
                adminVendorId = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveBetaFabric_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(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
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove beta fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsStillOpen_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is still open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndexGotReset_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex got reset Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminVendorIdDidNotGetReset_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId did not get reset Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (adminVendorId == nil) {
                    VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("AdminVendorId", actualValue));
                    VerifyOrReturn(CheckValue("AdminVendorId", actualValue, adminVendorId));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestMultiAdmin : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestMultiAdmin()
        : TestCommandBridge("TestMultiAdmin")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestMultiAdmin() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestMultiAdmin\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestMultiAdmin\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Stop target device\n");
            err = TestStopTargetDevice_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : Start target device with the provided discriminator for basic commissioning advertisement\n");
            err = TestStartTargetDeviceWithTheProvidedDiscriminatorForBasicCommissioningAdvertisement_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Wait for the commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Commission from alpha when the commissioning window is not opened\n");
            err = TestCommissionFromAlphaWhenTheCommissioningWindowIsNotOpened_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Commission from alpha again\n");
            err = TestCommissionFromAlphaAgain_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check that we just have the one fabric and did not add a new one\n");
            err = TestCheckThatWeJustHaveTheOneFabricAndDidNotAddANewOne_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Close Commissioning Window after failed commissioning\n");
            err = TestCloseCommissioningWindowAfterFailedCommissioning_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Open Commissioning Window from alpha again\n");
            err = TestOpenCommissioningWindowFromAlphaAgain_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Commission from beta\n");
            err = TestCommissionFromBeta_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Open Commissioning Window from beta\n");
            err = TestOpenCommissioningWindowFromBeta_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Commission from gamma\n");
            err = TestCommissionFromGamma_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait for the commissioned device to be retrieved for gamma\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : read the mandatory attribute: NodeLabel from alpha\n");
            err = TestReadTheMandatoryAttributeNodeLabelFromAlpha_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : write the mandatory attribute NodeLabel from beta\n");
            err = TestWriteTheMandatoryAttributeNodeLabelFromBeta_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : read the mandatory attribute: NodeLabel from gamma\n");
            err = TestReadTheMandatoryAttributeNodeLabelFromGamma_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : write the mandatory attribute NodeLabel back to default\n");
            err = TestWriteTheMandatoryAttributeNodeLabelBackToDefault_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestStopTargetDevice_0()
    {
        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTargetDeviceWithTheProvidedDiscriminatorForBasicCommissioningAdvertisement_1()
    {
        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_2()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCommissionFromAlphaWhenTheCommissioningWindowIsNotOpened_3()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("alpha", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromAlphaAgain_5()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("alpha", value);
    }

    CHIP_ERROR TestCheckThatWeJustHaveTheOneFabricAndDidNotAddANewOne_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = false;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Check that we just have the one fabric and did not add a new one Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindowAfterFailedCommissioning_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close Commissioning Window after failed commissioning Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha again Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_9()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromBeta_11()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from beta Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromGamma_12()
    {
        chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
        value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
        value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
        return PairWithCode("gamma", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
        return WaitForCommissionee("gamma", value);
    }
    NSString * _Nonnull readFromAlpha;

    CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromAlpha_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the mandatory attribute: NodeLabel from alpha Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }
            {
                readFromAlpha = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelFromBeta_15()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"written from beta";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"write the mandatory attribute NodeLabel from beta Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromGamma_16()
    {
        MTRBaseDevice * device = GetDevice("gamma");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the mandatory attribute: NodeLabel from gamma Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("nodeLabel", value, readFromAlpha));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelBackToDefault_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = [readFromAlpha copy];
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"write the mandatory attribute NodeLabel back to default Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGSW_1_1()
        : TestCommandBridge("Test_TC_DGSW_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGSW_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGSW_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGSW_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGSW.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGSW.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDGSWSF00WatermarksEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads optional attribute(ThreadMetrics) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeThreadMetricsInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(CurrentHeapFree) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentHeapFreeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(CurrentHeapUsed) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentHeapUsedInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList\n");
            if (ShouldSkip("DGSW.S.F00 || DGSW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeCurrentHeapHighWatermarkInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGSW.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGSW.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGSWSF00WatermarksEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeThreadMetricsInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ThreadMetrics) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapFreeInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CurrentHeapFree) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapUsedInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CurrentHeapUsed) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeCurrentHeapHighWatermarkInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                     endpointID:@(0)
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_OnOff : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSubscribe_OnOff()
        : TestCommandBridge("TestSubscribe_OnOff")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSubscribe_OnOff() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSubscribe_OnOff\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSubscribe_OnOff\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Set OnOff Attribute to false\n");
            err = TestSetOnOffAttributeToFalse_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Report: Subscribe OnOff Attribute\n");
            err = TestReportSubscribeOnOffAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Subscribe OnOff Attribute\n");
            err = TestSubscribeOnOffAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Turn On the light to see attribute change\n");
            err = TestTurnOnTheLightToSeeAttributeChange_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Check for attribute report\n");
            err = TestCheckForAttributeReport_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Turn Off the light to see attribute change\n");
            err = TestTurnOffTheLightToSeeAttributeChange_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Check for attribute report\n");
            err = TestCheckForAttributeReport_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSetOnOffAttributeToFalse_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Set OnOff Attribute to false Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestSubscribe_OnOff_OnOff_Reported = nil;

    CHIP_ERROR TestReportSubscribeOnOffAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe OnOff Attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, false));
            }

            testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeOnOffAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                          maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOnOffWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe OnOff Attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestSubscribe_OnOff_OnOff_Reported != nil) {
                    ResponseHandler callback = test_TestSubscribe_OnOff_OnOff_Reported;
                    test_TestSubscribe_OnOff_OnOff_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOnTheLightToSeeAttributeChange_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn On the light to see attribute change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForAttributeReport_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, true));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffTheLightToSeeAttributeChange_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off the light to see attribute change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForAttributeReport_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, false));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }
};

class 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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read available user slot and verify response fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedUsersAndVerifyDefaultValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported users and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfTotalUsersSupported", actualValue, 10U));
            }
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFailsForUserWithIndex0_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read fails for user with index 0 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFailsForUserWithIndexGreaterThanNumberOfUsersSupported_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read fails for user with index greater than Number Of Users Supported Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserWithDefaultParameters_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user with default parameters Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetUserAtTheOccupiedIndexFailsWithAppropriateResponse_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Set user at the occupied index fails with appropriate response Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_FAILURE));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserNameForExistingUser_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"new_user";
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userName for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserUniqueIdForExistingUser_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = [NSNumber numberWithUnsignedInt:305441741UL];
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userUniqueId for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserStatusForExistingUser_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userStatus for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserTypeForExistingUser_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = [NSNumber numberWithUnsignedChar:6U];
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userType for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 6U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyCredentialRuleForExistingUser_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = [NSNumber numberWithUnsignedChar:2U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify credentialRule for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 6U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 2U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyAllFieldsForExistingUser_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"test_user";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:466460832UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:1U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify all fields for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"test_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 466460832UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 1U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddAnotherUserWithNonDefaultFields_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = @"test_user2";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:12648430UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:1U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:2U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Add another user with non-default fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheNewUserBackAndVerifyItsFields_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the new user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"test_user2"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 12648430UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 1U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 2U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus0_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:0U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Try to add a user with userStatus 0 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure the user did not get created Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus2_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:2U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Try to add a user with userStatus 2 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure the user did not get created Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus3_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Try to add a user with userStatus 3 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheNewThirdUserBackAndVerifyItsFields_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the new third user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"test_user3"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 47802UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateUserInTheLastSlot_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        params.userName = @"last_user";
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create user in the last slot Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheLastUserBackAndVerifyItsFields_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the last user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, NumberOfTotalUsersSupported));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"last_user"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUserCreationInThe0SlotFails_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"User creation in the 0 slot fails Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUserCreationInTheOutOfBoundsSlotFails_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"User creation in the out-of-bounds slot fails Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearFirstUser_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear first user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadClearedUserAndVerifyItIsAvailable_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("nextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("nextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserInTheClearedSlot_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user in the cleared slot Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserInThePreviouslyClearedSlotAndVerifyItsFields_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user in the previously cleared slot and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("nextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("nextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserWithIndex0Fails_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearUserWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Clear user with index 0 fails Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_INVALID_COMMAND));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserWithOutOfBoundsIndexFails_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearUserWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Clear user with out-of-bounds index fails Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_INVALID_COMMAND));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllUsers_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear all users Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFirstClearedUserAndVerifyItIsAvailable_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read first cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLastClearedUserAndVerifyItIsAvailable_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read last cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, NumberOfTotalUsersSupported));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfPINUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedPinCredentialsAndVerifyDefaultValue_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfPINUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported PIN credentials and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfPINUsersSupported", actualValue, 10U));
            }
            {
                NumberOfPINUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatPinCredentialDoesNotExist_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Check that PIN credential does not exist Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingPinCredentialWithIndex0ReturnsNoCredential_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Reading PIN credential with index 0 returns no credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingPinCredentialWithOutOfBoundsIndexReturnsNoCredential_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        [cluster
            getCredentialStatusWithParams:params
                               completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Reading PIN credential with out-of-bounds index returns no credential Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.credentialExists;
                                       VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                   }

                                   {
                                       id actualValue = values.userIndex;
                                       VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.creatorFabricIndex;
                                       VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.lastModifiedFabricIndex;
                                       VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.nextCredentialIndex;
                                       VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatAUserWithUserStatus0CannotBeAddedViaSetCredential_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:0U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that a user with UserStatus = 0 cannot be added via SetCredential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatAUserWithUserStatus2CannotBeAddedViaSetCredential_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:2U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that a user with UserStatus = 2 cannot be added via SetCredential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUser_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedUser_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify created user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(1)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUserWithIndex0Fails_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user with index 0 fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUserWithOutOfBoundsIndexFails_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user with out-of-bounds index fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfRFIDUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedRfidCredentialsAndVerifyDefaultValue_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfRFIDUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported RFID credentials and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfRFIDUsersSupported", actualValue, 10U));
            }
            {
                NumberOfRFIDUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Reading RFID credential with index 0 returns no credential duplicate with bug "
                                              @"workaround Error: %@",
                                            err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingRfidCredentialWithOutOfBoundsIndexReturnsNoCredential_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        [cluster
            getCredentialStatusWithParams:params
                               completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Reading RFID credential with out-of-bounds index returns no credential Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.credentialExists;
                                       VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                   }

                                   {
                                       id actualValue = values.userIndex;
                                       VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.creatorFabricIndex;
                                       VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.lastModifiedFabricIndex;
                                       VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.nextCredentialIndex;
                                       VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatRfidCredentialDoesNotExist_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Check that RFID credential does not exist Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_123456" length:16];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(2)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 2U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedCredential_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndUserWithIndex0Fails_59()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"new_rfid_data_field" length:19];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and user with index 0 fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        params.credentialData = [[NSData alloc] initWithBytes:"new_rfid_data_field" length:19];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and user with out-of-bounds index fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewCredentialAndTryToAddItTo0User_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123465" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new credential and try to add it to 0 user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123465" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new credential and try to add it to out-of-bounds user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooShortData_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"12345" length:5];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooLongData_64()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456789" length:9];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with too long data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_65()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data" length:9];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithProgrammingUserTypeFails_66()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = [NSNumber numberWithUnsignedChar:3U];
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with Programming user type fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_67()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"very_long_rfid_data_to_test_boundaries" length:38];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential with data the would cause duplicate Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_123456" length:16];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with data the would cause duplicate Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyCredentialDataOfExistingPinCredential_70()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Modify credentialData of existing PIN credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_71()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that credential was changed by creating new credential with old data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_72()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that credential was changed by creating new credential with new data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_73()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_7890" length:14];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_74()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(3)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 4U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("nextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("nextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_75()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:5U];

        params.credentialData = [[NSData alloc] initWithBytes:"789012" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 6U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_76()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(4)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 4U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[3]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[3]).credentialIndex, 5U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("nextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("nextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearFirstPinCredential_77()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear first PIN credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_78()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndMakeSurePinCredentialIsDeleted_79()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and make sure PIN credential is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(3)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 4U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 5U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("nextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("nextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearTheSecondPinCredential_80()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear the second PIN credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_81()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_82()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and make sure related user is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithUser_83()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_12345" length:15];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllTheRfidCredentials_84()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear all the RFID credentials Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFistRfidCredentialAndMakeSureItIsDeleted_85()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the fist RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_86()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the second RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_87()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the third RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_88()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read the user related with first RFID back and make sure it has only PIN credential Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.userIndex;
                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.userName;
                           VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                           VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                       }

                       {
                           id actualValue = values.userUniqueId;
                           VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                       }

                       {
                           id actualValue = values.userStatus;
                           VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                           VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                       }

                       {
                           id actualValue = values.userType;
                           VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                           VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                       }

                       {
                           id actualValue = values.credentialRule;
                           VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                           VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                       }

                       {
                           id actualValue = values.credentials;
                           VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                           VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(1)));
                           VerifyOrReturn(CheckValue(
                               "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                           VerifyOrReturn(CheckValue(
                               "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 5U));
                       }

                       {
                           id actualValue = values.creatorFabricIndex;
                           VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                           VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.lastModifiedFabricIndex;
                           VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                           VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.nextUserIndex;
                           VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithSecondRfidBackAndMakeSureItIsDeleted_89()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with second RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialWithUser_90()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithUser_91()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_1234" length:14];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 3U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherRfidCredentialWithUser_92()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_9876" length:14];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create another RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 4U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 7U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllTheCredentials_93()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = nil;
        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear all the credentials Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFirstPinCredentialAndMakeSureItIsDeleted_94()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the first PIN credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFirstRfidCredentialAndMakeSureItIsDeleted_95()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the first RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheSecondPinCredentialAndMakeSureItIsDeleted_96()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the second PIN credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstPinBackAndMakeSureItIsDeleted_97()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with first PIN back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItIsDeleted_98()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with first RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithSecondPinBackAndMakeSureItIsDeleted_99()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with second PIN back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithLastRfidBackAndMakeSureItIsDeleted_100()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:4U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with last RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 4U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewProgrammingPinCredentialWithInvalidIndex_101()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new Programming PIN credential with invalid index Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewProgrammingPinCredentialWithValidIndex_102()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new Programming PIN credential with valid index Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedUser_103()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify created user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("credentials", actualValue));
                                VerifyOrReturn(CheckValue("credentials", [actualValue count], static_cast<uint32_t>(1)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 0U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 0U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedProgrammingPinCredential_104()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created programming PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyTheProgrammingPinCredential_105()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"654321" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Modify the Programming PIN credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingProgrammingPinFails_106()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing Programming PIN fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingProgrammingPinWithInvalidIndexFails_107()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing Programming PIN with invalid index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingPinCredentialWithZeroIndexFails_108()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing PIN credential with zero index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingPinCredentialWithOutOfBoundIndexFails_109()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing PIN credential with out-of-bound index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingRfidCredentialWithZeroIndexFails_110()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing RFID credential with zero index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingRfidCredentialWithOutOfBoundIndexFails_111()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing RFID credential with out-of-bound index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearTheProgrammingPinUser_112()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear the Programming PIN user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureProgrammingPinUserIsDeleted_113()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure Programming PIN user is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("userName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNull("userUniqueId", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("userStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("userType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("credentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureProgrammingPinCredentialIsDeleted_114()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Make sure programming PIN credential is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUser_115()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateSecondPinCredentialAndAddItToExistingUser_116()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"000001" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create second PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateThirdPinCredentialAndAddItToExistingUser_117()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"000002" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create third PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateFourthPinCredentialAndAddItToExistingUser_118()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"000003" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create fourth PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateFifthPinCredentialAndAddItToExistingUser_119()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:5U];

        params.credentialData = [[NSData alloc] initWithBytes:"000004" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create fifth PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 6U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToCreateSixthPinCredentialAndMakeSureItFails_120()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        params.credentialData = [[NSData alloc] initWithBytes:"000005" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Try to create sixth PIN credential and make sure it fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 137U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 7U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestFinalCleanUp_121()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Final clean-up Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class DL_LockUnlock : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    DL_LockUnlock()
        : TestCommandBridge("DL_LockUnlock")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~DL_LockUnlock() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: DL_LockUnlock\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: DL_LockUnlock\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Try to unlock the door without PIN\n");
            err = TestTryToUnlockTheDoorWithoutPin_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Try to lock the door without a PIN\n");
            err = TestTryToLockTheDoorWithoutAPin_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Set the WrongCodeEntryLimit to big value so that we can test incorrect PIN entry\n");
            err = TestSetTheWrongCodeEntryLimitToBigValueSoThatWeCanTestIncorrectPinEntry_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Try to unlock the door with invalid PIN\n");
            err = TestTryToUnlockTheDoorWithInvalidPin_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Try to unlock the door with valid PIN\n");
            err = TestTryToUnlockTheDoorWithValidPin_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Try to lock the door with invalid PIN\n");
            err = TestTryToLockTheDoorWithInvalidPin_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Try to lock the door with valid PIN\n");
            err = TestTryToLockTheDoorWithValidPin_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Set OperatingMode to NoRemoteLockUnlock\n");
            err = TestSetOperatingModeToNoRemoteLockUnlock_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Try to unlock the door when OperatingMode is NoRemoteLockUnlock\n");
            err = TestTryToUnlockTheDoorWhenOperatingModeIsNoRemoteLockUnlock_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Set OperatingMode to Normal\n");
            err = TestSetOperatingModeToNormal_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the lockout timeout\n");
            err = TestReadTheLockoutTimeout_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Set the WrongCodeEntryLimit to small value so we can test lockout\n");
            err = TestSetTheWrongCodeEntryLimitToSmallValueSoWeCanTestLockout_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Try to unlock the door with invalid PIN for the first time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheFirstTime_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Try to unlock the door with invalid PIN for the second time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheSecondTime_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Try to unlock the door with invalid PIN for the third time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheThirdTime_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Try to unlock the door with valid PIN and make sure it fails due to lockout\n");
            err = TestTryToUnlockTheDoorWithValidPinAndMakeSureItFailsDueToLockout_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait for the lockout to end\n");
            err = TestWaitForTheLockoutToEnd_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Try to unlock the door with valid PIN and make sure it succeeds\n");
            err = TestTryToUnlockTheDoorWithValidPinAndMakeSureItSucceeds_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Lock the door back prior to next tests\n");
            err = TestLockTheDoorBackPriorToNextTests_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Create a disabled user and credential\n");
            err = TestCreateADisabledUserAndCredential_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Try to unlock the door with disabled user PIN\n");
            err = TestTryToUnlockTheDoorWithDisabledUserPin_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Unlock the door with enabled user PIN\n");
            err = TestUnlockTheDoorWithEnabledUserPin_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Try to lock the door with disabled user PIN\n");
            err = TestTryToLockTheDoorWithDisabledUserPin_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Verify that lock state attribute value stays Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueStaysUnlocked_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Lock the door with enabled user PIN\n");
            err = TestLockTheDoorWithEnabledUserPin_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Clean all the users and credentials\n");
            err = TestCleanAllTheUsersAndCredentials_37();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 38;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithoutPin_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door without PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithoutAPin_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Try to lock the door without a PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheWrongCodeEntryLimitToBigValueSoThatWeCanTestIncorrectPinEntry_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Set the WrongCodeEntryLimit to big value so that we can test "
                                                           @"incorrect PIN entry Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPin_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPin_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door with valid PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithInvalidPin_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"Try to lock the door with invalid PIN Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithValidPin_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Try to lock the door with valid PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOperatingModeToNoRemoteLockUnlock_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Set OperatingMode to NoRemoteLockUnlock Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWhenOperatingModeIsNoRemoteLockUnlock_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door when OperatingMode is NoRemoteLockUnlock Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOperatingModeToNormal_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Set OperatingMode to Normal Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheLockoutTimeout_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the lockout timeout Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UserCodeTemporaryDisableTime", actualValue, 10U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheWrongCodeEntryLimitToSmallValueSoWeCanTestLockout_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster
            writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Set the WrongCodeEntryLimit to small value so we can test lockout Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheFirstTime_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the first time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheSecondTime_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the second time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheThirdTime_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the third time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItFailsDueToLockout_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with valid PIN and make sure it fails due to lockout Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitForTheLockoutToEnd_24()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItSucceeds_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door with valid PIN and make sure it succeeds Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLockTheDoorBackPriorToNextTests_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Lock the door back prior to next tests Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateADisabledUserAndCredential_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"654321" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create a disabled user and credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithDisabledUserPin_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"654321" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with disabled user PIN Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUnlockTheDoorWithEnabledUserPin_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Unlock the door with enabled user PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithDisabledUserPin_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"654321" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"Try to lock the door with disabled user PIN Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueStaysUnlocked_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value stays Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLockTheDoorWithEnabledUserPin_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Lock the door with enabled user PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanAllTheUsersAndCredentials_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clean all the users and credentials Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class DL_Schedules : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    DL_Schedules()
        : TestCommandBridge("DL_Schedules")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~DL_Schedules() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: DL_Schedules\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: DL_Schedules\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new PIN credential and schedule user\n");
            err = TestCreateNewPinCredentialAndScheduleUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Get number of supported users\n");
            err = TestGetNumberOfSupportedUsers_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Get Max number of Week Day schedules for user and verify default value\n");
            err = TestGetMaxNumberOfWeekDaySchedulesForUserAndVerifyDefaultValue_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Get Max number of Year Day schedules for user and verify default value\n");
            err = TestGetMaxNumberOfYearDaySchedulesForUserAndVerifyDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Get Max number of Holiday schedules and verify default value\n");
            err = TestGetMaxNumberOfHolidaySchedulesAndVerifyDefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Create Week Day schedule with 0 index\n");
            err = TestCreateWeekDayScheduleWith0Index_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Create Week Day schedule with out-of-bounds index\n");
            err = TestCreateWeekDayScheduleWithOutOfBoundsIndex_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Create Week Day schedule with 0 user index\n");
            err = TestCreateWeekDayScheduleWith0UserIndex_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Create Week Day schedule with out-of-bounds user index\n");
            err = TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Create Week Day schedule for non-existing user\n");
            err = TestCreateWeekDayScheduleForNonExistingUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Create Week Day schedule with 0 days mask\n");
            err = TestCreateWeekDayScheduleWith0DaysMask_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Create Week Day schedule for Sunday and Monday\n");
            err = TestCreateWeekDayScheduleForSundayAndMonday_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Create Week Day schedule for Sunday Wednesday and Saturday\n");
            err = TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Create Week Day schedule with invalid start hour\n");
            err = TestCreateWeekDayScheduleWithInvalidStartHour_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Create Week Day schedule with invalid start minute\n");
            err = TestCreateWeekDayScheduleWithInvalidStartMinute_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Create Week Day schedule with invalid end hour\n");
            err = TestCreateWeekDayScheduleWithInvalidEndHour_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Create Week Day schedule with invalid end minute\n");
            err = TestCreateWeekDayScheduleWithInvalidEndMinute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Create Week Day schedule with start hour later that end hour\n");
            err = TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : Create Week Day schedule with start minute later that end minute when hours are equal\n");
            err = TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Get Week Day schedule with 0 index\n");
            err = TestGetWeekDayScheduleWith0Index_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Get Week Day schedule with out-of-bounds index\n");
            err = TestGetWeekDayScheduleWithOutOfBoundsIndex_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Get Week Day schedule with 0 user index\n");
            err = TestGetWeekDayScheduleWith0UserIndex_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Get Week Day schedule with out-of-bounds user index\n");
            err = TestGetWeekDayScheduleWithOutOfBoundsUserIndex_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Get Week Day schedule with non-existing user index\n");
            err = TestGetWeekDayScheduleWithNonExistingUserIndex_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Create Year Day schedule with 0 index\n");
            err = TestCreateYearDayScheduleWith0Index_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Create Year Day schedule with out-of-bounds index\n");
            err = TestCreateYearDayScheduleWithOutOfBoundsIndex_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Create Year Day schedule with 0 user index\n");
            err = TestCreateYearDayScheduleWith0UserIndex_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Create Year Day schedule with out-of-bounds user index\n");
            err = TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Create Year Day schedule for non-existing user\n");
            err = TestCreateYearDayScheduleForNonExistingUser_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Create Year Day schedule with start hour later that end hour\n");
            err = TestCreateYearDayScheduleWithStartHourLaterThatEndHour_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Get Year Day schedule with 0 index\n");
            err = TestGetYearDayScheduleWith0Index_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Get Year Day schedule with out-of-bounds index\n");
            err = TestGetYearDayScheduleWithOutOfBoundsIndex_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Get Year Day schedule with 0 user index\n");
            err = TestGetYearDayScheduleWith0UserIndex_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Get Year Day schedule with out-of-bounds user index\n");
            err = TestGetYearDayScheduleWithOutOfBoundsUserIndex_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Get Year Day schedule with non-existing user index\n");
            err = TestGetYearDayScheduleWithNonExistingUserIndex_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Create Holiday schedule with 0 index\n");
            err = TestCreateHolidayScheduleWith0Index_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Create Holiday schedule with out-of-bounds index\n");
            err = TestCreateHolidayScheduleWithOutOfBoundsIndex_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Create Holiday schedule with start hour later that end hour\n");
            err = TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Create Holiday schedule with invalid operating mode\n");
            err = TestCreateHolidayScheduleWithInvalidOperatingMode_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Get Holiday schedule with 0 index\n");
            err = TestGetHolidayScheduleWith0Index_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Get Holiday schedule with out-of-bounds index\n");
            err = TestGetHolidayScheduleWithOutOfBoundsIndex_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Create Holiday schedule with valid parameters\n");
            err = TestCreateHolidayScheduleWithValidParameters_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Create Week Day schedule with valid parameters\n");
            err = TestCreateWeekDayScheduleWithValidParameters_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Create Year Day schedule with valid parameters\n");
            err = TestCreateYearDayScheduleWithValidParameters_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Clear Week Day schedule with 0 index\n");
            err = TestClearWeekDayScheduleWith0Index_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Clear Week Day schedule with out-of-bounds index\n");
            err = TestClearWeekDayScheduleWithOutOfBoundsIndex_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Clear Week Day schedule with 0 user index\n");
            err = TestClearWeekDayScheduleWith0UserIndex_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Clear Week Day schedule with out-of-bounds user index\n");
            err = TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Clear Week Day schedule with non-existing user\n");
            err = TestClearWeekDayScheduleWithNonExistingUser_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Clear Year Day schedule with 0 index\n");
            err = TestClearYearDayScheduleWith0Index_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Clear Year Day schedule with out-of-bounds index\n");
            err = TestClearYearDayScheduleWithOutOfBoundsIndex_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Clear Year Day schedule with 0 user index\n");
            err = TestClearYearDayScheduleWith0UserIndex_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Clear Year Day schedule with out-of-bounds user index\n");
            err = TestClearYearDayScheduleWithOutOfBoundsUserIndex_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Clear Year Day schedule with non-existing user\n");
            err = TestClearYearDayScheduleWithNonExistingUser_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Clear Holiday schedule with 0 index\n");
            err = TestClearHolidayScheduleWith0Index_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Clear Holiday schedule with out-of-bounds index\n");
            err = TestClearHolidayScheduleWithOutOfBoundsIndex_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Create another Week Day schedule with valid parameters\n");
            err = TestCreateAnotherWeekDayScheduleWithValidParameters_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Verify created week day schedule\n");
            err = TestVerifyCreatedWeekDaySchedule_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Create another Year Day schedule with valid parameters\n");
            err = TestCreateAnotherYearDayScheduleWithValidParameters_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Verify created year day schedule\n");
            err = TestVerifyCreatedYearDaySchedule_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Create another Holiday schedule with valid parameters\n");
            err = TestCreateAnotherHolidayScheduleWithValidParameters_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Verify created holiday schedule\n");
            err = TestVerifyCreatedHolidaySchedule_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Clear a single week day schedule for the first user\n");
            err = TestClearASingleWeekDayScheduleForTheFirstUser_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Verify cleared week day schedule\n");
            err = TestVerifyClearedWeekDaySchedule_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Clear all remaining week day schedules for the first user\n");
            err = TestClearAllRemainingWeekDaySchedulesForTheFirstUser_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Verify cleared week schedule\n");
            err = TestVerifyClearedWeekSchedule_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Make sure that first year day schedule was not deleted\n");
            err = TestMakeSureThatFirstYearDayScheduleWasNotDeleted_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Make sure that second year day schedule was not deleted\n");
            err = TestMakeSureThatSecondYearDayScheduleWasNotDeleted_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Make sure that second holiday schedule was not deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasNotDeleted_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Create another Week Day schedule with valid parameters\n");
            err = TestCreateAnotherWeekDayScheduleWithValidParameters_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Clear a single year day schedule for the first user\n");
            err = TestClearASingleYearDayScheduleForTheFirstUser_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Verify cleared year day schedule\n");
            err = TestVerifyClearedYearDaySchedule_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Clear all remaining year schedules for the first user\n");
            err = TestClearAllRemainingYearSchedulesForTheFirstUser_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Verify that second year day schedule was cleared\n");
            err = TestVerifyThatSecondYearDayScheduleWasCleared_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Verify created week day schedule\n");
            err = TestVerifyCreatedWeekDaySchedule_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Clear all remaining week day schedules for the first user\n");
            err = TestClearAllRemainingWeekDaySchedulesForTheFirstUser_92();
            break;
        case 93:
            ChipLogProgress(
                chipTool, " ***** Test Step 93 : Create new user without credential so we can add more schedules to it\n");
            err = TestCreateNewUserWithoutCredentialSoWeCanAddMoreSchedulesToIt_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Create Week Day schedule with valid parameters for first user\n");
            err = TestCreateWeekDayScheduleWithValidParametersForFirstUser_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Verify created week day schedule for first user\n");
            err = TestVerifyCreatedWeekDayScheduleForFirstUser_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Create Year Day schedule for first user\n");
            err = TestCreateYearDayScheduleForFirstUser_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Verify created year day schedule for first\n");
            err = TestVerifyCreatedYearDayScheduleForFirst_97();
            break;
        case 98:
            ChipLogProgress(chipTool, " ***** Test Step 98 : Create Week Day schedule with valid parameters for second user\n");
            err = TestCreateWeekDayScheduleWithValidParametersForSecondUser_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Verify created week day schedule for first user\n");
            err = TestVerifyCreatedWeekDayScheduleForFirstUser_99();
            break;
        case 100:
            ChipLogProgress(chipTool, " ***** Test Step 100 : Create Year Day schedule for second user\n");
            err = TestCreateYearDayScheduleForSecondUser_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Verify created year day schedule for first\n");
            err = TestVerifyCreatedYearDayScheduleForFirst_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Cleanup the user\n");
            err = TestCleanupTheUser_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Make sure clearing first user also cleared week day schedules\n");
            err = TestMakeSureClearingFirstUserAlsoClearedWeekDaySchedules_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Make sure clearing first user also cleared year day schedules\n");
            err = TestMakeSureClearingFirstUserAlsoClearedYearDaySchedules_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Make sure clearing second user also cleared week day schedules\n");
            err = TestMakeSureClearingSecondUserAlsoClearedWeekDaySchedules_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Make sure clearing second user also cleared year day schedules\n");
            err = TestMakeSureClearingSecondUserAlsoClearedYearDaySchedules_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Make sure that second holiday schedule was not deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasNotDeleted_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Create another Holiday schedule at the last slot\n");
            err = TestCreateAnotherHolidayScheduleAtTheLastSlot_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Verify Created Holiday Schedule\n");
            err = TestVerifyCreatedHolidaySchedule_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Create new PIN credential and schedule user\n");
            err = TestCreateNewPinCredentialAndScheduleUser_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Create Week Day schedule for first user\n");
            err = TestCreateWeekDayScheduleForFirstUser_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Create Year Day schedule for first user\n");
            err = TestCreateYearDayScheduleForFirstUser_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Clear a single holiday schedule\n");
            err = TestClearASingleHolidaySchedule_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Make sure that second holiday schedule was deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasDeleted_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Make sure that third holiday schedule was not deleted\n");
            err = TestMakeSureThatThirdHolidayScheduleWasNotDeleted_117();
            break;
        case 118:
            ChipLogProgress(
                chipTool, " ***** Test Step 118 : Make sure clearing holiday schedule did not clear week day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_118();
            break;
        case 119:
            ChipLogProgress(
                chipTool, " ***** Test Step 119 : Make sure clearing holiday schedule did not clear year day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Clear all remaining holiday schedules\n");
            err = TestClearAllRemainingHolidaySchedules_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Make sure that first holiday is still deleted\n");
            err = TestMakeSureThatFirstHolidayIsStillDeleted_121();
            break;
        case 122:
            ChipLogProgress(chipTool, " ***** Test Step 122 : Make sure that second holiday schedule was deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasDeleted_122();
            break;
        case 123:
            ChipLogProgress(chipTool, " ***** Test Step 123 : Make sure that third holiday schedule was not deleted\n");
            err = TestMakeSureThatThirdHolidayScheduleWasNotDeleted_123();
            break;
        case 124:
            ChipLogProgress(
                chipTool, " ***** Test Step 124 : Make sure clearing holiday schedule did not clear week day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_124();
            break;
        case 125:
            ChipLogProgress(
                chipTool, " ***** Test Step 125 : Make sure clearing holiday schedule did not clear year day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_125();
            break;
        case 126:
            ChipLogProgress(chipTool, " ***** Test Step 126 : Final Cleanup\n");
            err = TestFinalCleanup_126();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_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
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and schedule user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedUsers_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported users Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfTotalUsersSupported", actualValue, 10U));
            }
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfWeekDaySchedulesSupportedPerUser;

    CHIP_ERROR TestGetMaxNumberOfWeekDaySchedulesForUserAndVerifyDefaultValue_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get Max number of Week Day schedules for user and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfWeekDaySchedulesSupportedPerUser", actualValue, 10U));
            }
            {
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfYearDaySchedulesSupportedPerUser;

    CHIP_ERROR TestGetMaxNumberOfYearDaySchedulesForUserAndVerifyDefaultValue_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get Max number of Year Day schedules for user and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfYearDaySchedulesSupportedPerUser", actualValue, 10U));
            }
            {
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfHolidaySchedulesSupported;

    CHIP_ERROR TestGetMaxNumberOfHolidaySchedulesAndVerifyDefaultValue_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfHolidaySchedulesSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Get Max number of Holiday schedules and verify default value Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("NumberOfHolidaySchedulesSupported", actualValue, 10U));
                }
                {
                    NumberOfHolidaySchedulesSupported = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0Index_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsIndex_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0UserIndex_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForNonExistingUser_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for non-existing user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_FAILURE));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0DaysMask_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:0U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 days mask Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayAndMonday_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:3U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for Sunday and Monday Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:73U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for Sunday Wednesday and Saturday Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartHour_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:24U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid start hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartMinute_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:60U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid start minute Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndHour_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:24U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndMinute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:60U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid end minute Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:19U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:50U];
        params.endHour = [NSNumber numberWithUnsignedChar:15U];
        params.endMinute = [NSNumber numberWithUnsignedChar:49U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with start minute later that end minute when hours are "
                                             @"equal Error: %@",
                                           err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWith0Index_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsIndex_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue,
                                               [NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWith0UserIndex_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsUserIndex_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue(
                                               "userIndex", actualValue, [NumberOfTotalUsersSupported unsignedShortValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithNonExistingUserIndex_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with non-existing user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWith0Index_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsIndex_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWith0UserIndex_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForNonExistingUser_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for non-existing user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_FAILURE));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithStartHourLaterThatEndHour_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345688UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWith0Index_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsIndex_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue,
                                               [NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWith0UserIndex_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsUserIndex_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue(
                                               "userIndex", actualValue, [NumberOfTotalUsersSupported unsignedShortValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithNonExistingUserIndex_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with non-existing user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWith0Index_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithOutOfBoundsIndex_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345688UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithInvalidOperatingMode_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:5U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with invalid operating mode Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_FIELD));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWith0Index_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWithOutOfBoundsIndex_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue,
                                               [NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithValidParameters_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParameters_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithValidParameters_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWith0Index_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsIndex_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWith0UserIndex_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with 0 user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with out-of-bounds user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithNonExistingUser_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with non-existing user Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_FAILURE));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWith0Index_59()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsIndex_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWith0UserIndex_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with 0 user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsUserIndex_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with out-of-bounds user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithNonExistingUser_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with non-existing user Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_FAILURE));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_64()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_65()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_66()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWith0Index_67()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            clearHolidayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Holiday schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWithOutOfBoundsIndex_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        [cluster
            clearHolidayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Holiday schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_FIELD));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_70()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_71()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_72()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDaySchedule_73()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherYearDayScheduleWithValidParameters_74()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Year Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDaySchedule_75()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherHolidayScheduleWithValidParameters_76()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:123456UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:1234567UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:1U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Holiday schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedHolidaySchedule_77()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created holiday schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleWeekDayScheduleForTheFirstUser_78()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single week day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedWeekDaySchedule_79()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_80()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining week day schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedWeekSchedule_81()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared week schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstYearDayScheduleWasNotDeleted_82()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondYearDayScheduleWasNotDeleted_83()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_84()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_85()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_86()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleYearDayScheduleForTheFirstUser_87()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single year day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedYearDaySchedule_88()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingYearSchedulesForTheFirstUser_89()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining year schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatSecondYearDayScheduleWasCleared_90()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify that second year day schedule was cleared Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDaySchedule_91()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_92()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining week day schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserWithoutCredentialSoWeCanAddMoreSchedulesToIt_93()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = nil;
        params.userUniqueId = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user without credential so we can add more schedules to it Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForFirstUser_94()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_95()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForFirstUser_96()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_97()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule for first Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForSecondUser_98()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.daysMask = [NSNumber numberWithUnsignedChar:64U];
        params.startHour = [NSNumber numberWithUnsignedChar:23U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters for second user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_99()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 64U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForSecondUser_100()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:55555UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:7777777UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for second user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_101()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule for first Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 55555UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 7777777UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheUser_102()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedWeekDaySchedules_103()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing first user also cleared week day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedYearDaySchedules_104()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing first user also cleared year day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedWeekDaySchedules_105()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing second user also cleared week day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedYearDaySchedules_106()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing second user also cleared year day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_107()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_108()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherHolidayScheduleAtTheLastSlot_109()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:100UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:4U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Holiday schedule at the last slot Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedHolidaySchedule_110()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Verify Created Holiday Schedule Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("holidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.localStartTime;
                                      VerifyOrReturn(CheckValue("localStartTime", actualValue, 1UL));
                                  }

                                  {
                                      id actualValue = values.localEndTime;
                                      VerifyOrReturn(CheckValue("localEndTime", actualValue, 100UL));
                                  }

                                  {
                                      id actualValue = values.operatingMode;
                                      VerifyOrReturn(CheckValue("operatingMode", actualValue, 4U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndScheduleUser_111()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and schedule user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                 VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForFirstUser_112()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForFirstUser_113()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleHolidaySchedule_114()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster clearHolidayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single holiday schedule Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_115()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("operatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_116()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_117()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Make sure that third holiday schedule was not deleted Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("holidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.localStartTime;
                                      VerifyOrReturn(CheckValue("localStartTime", actualValue, 1UL));
                                  }

                                  {
                                      id actualValue = values.localEndTime;
                                      VerifyOrReturn(CheckValue("localEndTime", actualValue, 100UL));
                                  }

                                  {
                                      id actualValue = values.operatingMode;
                                      VerifyOrReturn(CheckValue("operatingMode", actualValue, 4U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_118()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_119()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingHolidaySchedules_120()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:254U];
        [cluster clearHolidayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining holiday schedules Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayIsStillDeleted_121()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday is still deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_122()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("holidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_123()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Make sure that third holiday schedule was not deleted Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("holidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_124()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("daysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("startHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("startMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("endHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("endMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_125()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestFinalCleanup_126()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Final Cleanup Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_1_1()
        : TestCommandBridge("Test_TC_DRLK_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DRLK.S.F00 && !DRLK.S.F01 && !DRLK.S.F02 && !DRLK.S.F04 && !DRLK.S.F05 && !DRLK.S.F06 && !DRLK.S.F07 "
                           "&& !DRLK.S.F08 && !DRLK.S.F0a && !DRLK.S.F0b ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf00pinEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given DRLK.S.F01(RID) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf01ridEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf02fgpEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf04wdschEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F05")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf05dpsEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F06")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf06faceEnsureFeaturemapHasTheCorrectBitSet_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F07")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf07cotaEnsureFeaturemapHasTheCorrectBitSet_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Given DRLK.S.F08(USR) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf08usrEnsureFeaturemapHasTheCorrectBitSet_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestGivenDRLKSF0aYDSCHEnsureFeaturemapHasTheCorrectBitSet_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestGivenDRLKSF0bHDSCHEnsureFeaturemapHasTheCorrectBitSet_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F05")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF05AttributesInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF08AttributesInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF00AttributesInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF01AttributesInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF04AttributeInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF0aAttributeInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF0bAttributeInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F00 || DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF00OrDrlksf01AttributesInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(chipTool,
                " ***** Test Step 22 : TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F07 || DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF07OrDrlksf00AttributeInAttributeList_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads optional attribute(Language) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLanguageInAttributeList_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads optional attribute(LEDSettings) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0022")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLEDSettingsInAttributeList_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads optional attribute(AutoRelockTime) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeAutoRelockTimeInAttributeList_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads optional attribute(SoundVolume) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0024")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSoundVolumeInAttributeList_26();
            break;
        case 27:
            ChipLogProgress(
                chipTool, " ***** Test Step 27 : TH reads optional attribute(DefaultConfigurationRegister) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0027")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeDefaultConfigurationRegisterInAttributeList_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : TH reads optional attribute(EnableLocalProgramming) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0028")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableLocalProgrammingInAttributeList_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : TH reads optional attribute(EnableOneTouchLocking) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0029")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableOneTouchLockingInAttributeList_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : TH reads optional attribute(EnableInsideStatusLED) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableInsideStatusLEDInAttributeList_30();
            break;
        case 31:
            ChipLogProgress(
                chipTool, " ***** Test Step 31 : TH reads optional attribute(EnablePrivacyModeButton) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnablePrivacyModeButtonInAttributeList_31();
            break;
        case 32:
            ChipLogProgress(
                chipTool, " ***** Test Step 32 : TH reads optional attribute(LocalProgrammingFeatures) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLocalProgrammingFeaturesInAttributeList_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_33();
            break;
        case 34:
            ChipLogProgress(
                chipTool, " ***** Test Step 34 : TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF04InAcceptedCommandList_34();
            break;
        case 35:
            ChipLogProgress(
                chipTool, " ***** Test Step 35 : TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF0aInAcceptedCommandList_35();
            break;
        case 36:
            ChipLogProgress(
                chipTool, " ***** Test Step 36 : TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF0bInAcceptedCommandList_36();
            break;
        case 37:
            ChipLogProgress(
                chipTool, " ***** Test Step 37 : TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF08InAcceptedCommandList_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalCommandsDRLKSC03RspInAcceptedCommandList_38();
            break;
        case 39:
            ChipLogProgress(
                chipTool, " ***** Test Step 39 : TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF04InGeneratedCommandList_39();
            break;
        case 40:
            ChipLogProgress(
                chipTool, " ***** Test Step 40 : TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF0aInGeneratedCommandList_40();
            break;
        case 41:
            ChipLogProgress(
                chipTool, " ***** Test Step 41 : TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF0bInGeneratedCommandList_41();
            break;
        case 42:
            ChipLogProgress(
                chipTool, " ***** Test Step 42 : TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF08InGeneratedCommandList_42();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 43;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 6U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf00pinEnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf01ridEnsureFeaturemapHasTheCorrectBitSet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F01(RID) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf02fgpEnsureFeaturemapHasTheCorrectBitSet_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf04wdschEnsureFeaturemapHasTheCorrectBitSet_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf05dpsEnsureFeaturemapHasTheCorrectBitSet_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf06faceEnsureFeaturemapHasTheCorrectBitSet_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf07cotaEnsureFeaturemapHasTheCorrectBitSet_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf08usrEnsureFeaturemapHasTheCorrectBitSet_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F08(USR) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDRLKSF0aYDSCHEnsureFeaturemapHasTheCorrectBitSet_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDRLKSF0bHDSCHEnsureFeaturemapHasTheCorrectBitSet_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 37UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 38UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF05AttributesInAttributeList_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF08AttributesInAttributeList_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF00AttributesInAttributeList_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 24UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF01AttributesInAttributeList_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF04AttributeInAttributeList_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF0aAttributeInAttributeList_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF0bAttributeInAttributeList_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF00OrDrlksf01AttributesInAttributeList_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 48UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 49UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF07OrDrlksf00AttributeInAttributeList_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 51UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLanguageInAttributeList_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Language) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLEDSettingsInAttributeList_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LEDSettings) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeAutoRelockTimeInAttributeList_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(AutoRelockTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 35UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSoundVolumeInAttributeList_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SoundVolume) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 36UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeDefaultConfigurationRegisterInAttributeList_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(DefaultConfigurationRegister) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 39UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableLocalProgrammingInAttributeList_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableLocalProgramming) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 40UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableOneTouchLockingInAttributeList_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableOneTouchLocking) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 41UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableInsideStatusLEDInAttributeList_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableInsideStatusLED) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 42UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnablePrivacyModeButtonInAttributeList_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnablePrivacyModeButton) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 43UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLocalProgrammingFeaturesInAttributeList_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LocalProgrammingFeatures) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 44UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF04InAcceptedCommandList_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 13UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0aInAcceptedCommandList_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 14UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0bInAcceptedCommandList_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF08InAcceptedCommandList_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 26UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 29UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 34UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 36UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 38UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalCommandsDRLKSC03RspInAcceptedCommandList_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF04InGeneratedCommandList_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0aInGeneratedCommandList_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0bInGeneratedCommandList_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF08InGeneratedCommandList_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 28UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 35UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 37UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_2()
        : TestCommandBridge("Test_TC_DRLK_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_2() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends Lock Door Command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutPINCode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends Lock Door Command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithValidPINCode_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Lock Door Command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithValidPINCode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Lock Door Command to the DUT without valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutValidPINCode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Lock Door Command to the DUT without any argument PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutAnyArgumentPINCode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads the WrongCodeEntryLimit attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThReadsTheWrongCodeEntryLimitAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH sends an Unlock Door Command from the DUT with invalid PINCode. Repeat this step "
                "PIXIT.DRLK.WrongCodeEntryLimit times and Verify that DUT sends failure response to the TH\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThSendsAnUnlockDoorCommandFromTheDutWithInvalidPINCodeRepeatThisStepPIXITDRLKWrongCodeEntryLimitTimesAndVerifyThatDutSendsFailureResponseToTheTh_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH sends an Unlock Door Command from User1 to the DUT with the valid PINCode and verify the "
                "DUT response\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCodeAndVerifyTheDutResponse_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : Wait for PIXIT.DRLK.UserCodeTemporaryDisableTime.TH then sends an Unlock Door Command from "
                "User1 to the DUT with the valid PINCode.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestWaitForPIXITDRLKUserCodeTemporaryDisableTimeTHThenSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCode_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads the UserCodeTemporaryDisableTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and "
                "Verify that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and "
                "verify DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Clean the created user\n");
            err = TestCleanTheCreatedUser_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Cleanup the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanupTheCreatedCredential_26();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 27;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutPINCode_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT without PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT with valid PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT with valid PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutValidPINCode_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"645321" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"TH sends Lock Door Command to the DUT without valid PINCode Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutAnyArgumentPINCode_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"TH sends Lock Door Command to the DUT without any argument PINCode Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheWrongCodeEntryLimitAttributeFromTheDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWrongCodeEntryLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the WrongCodeEntryLimit attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsAnUnlockDoorCommandFromTheDutWithInvalidPINCodeRepeatThisStepPIXITDRLKWrongCodeEntryLimitTimesAndVerifyThatDutSendsFailureResponseToTheTh_17()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCodeAndVerifyTheDutResponse_18()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestWaitForPIXITDRLKUserCodeTemporaryDisableTimeTHThenSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCode_19()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on "
                                                           @"the DUT and Verify that the DUT sends Success response Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on "
                                                           @"the DUT and verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the UserCodeTemporaryDisableTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as "
                                                                    @"between 1 and 255 on the DUT and Verify that the DUT sends "
                                                                    @"Success response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as "
                                                                    @"between 1 and 255 on the DUT and verify DUT responds with "
                                                                    @"UNSUPPORTED_WRITE Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedUser_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clean the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedCredential_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Cleanup the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_3()
        : TestCommandBridge("Test_TC_DRLK_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_3() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends the unlock Door command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends the unlock Door command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and Verify that the DUT sends "
                "Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and verify DUT responds with "
                "UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is "
                "triggered\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDutAndCheckAttributeIsTriggered_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("!DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("!DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads the AutoRelockTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAutoRelockTimeAttributeFromTheDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads the AutoRelockTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAutoRelockTimeAttributeFromTheDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool,
                " ***** Test Step 32 : TH sends the unlock Door command to the DUT with valid PINCode and Verify that DUT sends "
                "SUCCESS response to the TH\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCodeAndVerifyThatDutSendsSuccessResponseToTheTh_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : TH reads LockState attribute after AutoRelockTime Expires and Verify that the DUT is "
                "locked.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLockStateAttributeAfterAutoRelockTimeExpiresAndVerifyThatTheDutIsLocked_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Clean the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanTheCreatedCredential_35();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 36;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT without PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT without PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and "
                                                           @"Verify that the DUT sends Success response Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and "
                                                           @"verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 "
                                                                    @"Seconds on the DUT and Verify that the DUT sends Success "
                                                                    @"response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 "
                                                                    @"Seconds on the DUT and Verify that the DUT sends Success "
                                                                    @"response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDutAndCheckAttributeIsTriggered_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is triggered Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UserCodeTemporaryDisableTime", actualValue, 15U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:10UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 10 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:10UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 10 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AutoRelockTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AutoRelockTime", actualValue, 10UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AutoRelockTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AutoRelockTime", actualValue, 60UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCodeAndVerifyThatDutSendsSuccessResponseToTheTh_32()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttributeAfterAutoRelockTimeExpiresAndVerifyThatTheDutIsLocked_33()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestCleanupTheCreatedUser_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedCredential_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clean the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_4()
        : TestCommandBridge("Test_TC_DRLK_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_4() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip(" !DRLK.S.A0023 ")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends the Unlock with Timeout argument value as 60 seconds\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockWithTimeoutArgumentValueAs60Seconds_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 60s\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestWait60s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads LockState attribute\n");
            if (ShouldSkip("DRLK.S.A0000 && DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsLockStateAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Clean the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanTheCreatedCredential_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockWithTimeoutArgumentValueAs60Seconds_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockWithTimeoutParams alloc] init];
        params.timeout = [NSNumber numberWithUnsignedShort:60U];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockWithTimeoutWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends the Unlock with Timeout argument value as 60 seconds Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait60s_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 60000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttribute_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LockState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedCredential_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clean the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_5()
        : TestCommandBridge("Test_TC_DRLK_2_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_5() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfWeekDaySchedulesSupportedPerUserAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads NumberOfTotalUsers Supported attribute\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH send Set Week Day Schedule Command\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetWeekDayScheduleCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH send Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendGetWeekDayScheduleCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH send Set Week Day Schedule Command\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetWeekDayScheduleCommand_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH send Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendGetWeekDayScheduleCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends Clear Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0d.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearWeekDayScheduleCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH sends Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetWeekDayScheduleCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfWeekDaySchedulesSupportedPerUser;

    CHIP_ERROR TestThReadsNumberOfWeekDaySchedulesSupportedPerUserAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("numberOfWeekDaySchedulesSupportedPerUser", [value unsignedCharValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("numberOfWeekDaySchedulesSupportedPerUser", [value unsignedCharValue], 255U));
            {
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsers Supported attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetWeekDayScheduleCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:45U];
        params.endHour = [NSNumber numberWithUnsignedChar:16U];
        params.endMinute = [NSNumber numberWithUnsignedChar:55U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Week Day Schedule Command Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getWeekDayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"TH send Get Week Day Schedule Command to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.weekDayIndex;
                                      VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                  }

                                  {
                                      id actualValue = values.userIndex;
                                      VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.daysMask;
                                      VerifyOrReturn(CheckValue("daysMask", actualValue, 2U));
                                  }

                                  {
                                      id actualValue = values.startHour;
                                      VerifyOrReturn(CheckValue("startHour", actualValue, 15U));
                                  }

                                  {
                                      id actualValue = values.startMinute;
                                      VerifyOrReturn(CheckValue("startMinute", actualValue, 45U));
                                  }

                                  VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, true));
                                  if (values.endHour != nil) {

                                      VerifyOrReturn(
                                          CheckConstraintMinValue<uint8_t>("endHour", [values.endHour unsignedCharValue], 16U));
                                  }

                                  VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, true));
                                  if (values.endMinute != nil) {

                                      VerifyOrReturn(
                                          CheckConstraintMinValue<uint8_t>("endMinute", [values.endMinute unsignedCharValue], 55U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetWeekDayScheduleCommand_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:7U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:45U];
        params.endHour = [NSNumber numberWithUnsignedChar:16U];
        params.endMinute = [NSNumber numberWithUnsignedChar:55U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Week Day Schedule Command Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH send Get Week Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("daysMask", values.daysMask, false));
                                       if (values.daysMask != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startHour", values.startHour, false));
                                       if (values.startHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startMinute", values.startMinute, false));
                                       if (values.startMinute != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, false));
                                       if (values.endHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, false));
                                       if (values.endMinute != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearWeekDayScheduleCommandToDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends Clear Week Day Schedule Command to DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetWeekDayScheduleCommandToDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Week Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("weekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("daysMask", values.daysMask, false));
                                       if (values.daysMask != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startHour", values.startHour, false));
                                       if (values.startHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startMinute", values.startMinute, false));
                                       if (values.startMinute != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, false));
                                       if (values.endHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, false));
                                       if (values.endMinute != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_7 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_7()
        : TestCommandBridge("Test_TC_DRLK_2_7")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_7() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_7\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_7\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads NumberOfYearDay SchedulesSupportedPerUser attribute\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfYearDaySchedulesSupportedPerUserAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads NumberOfTotalUsers Supported attribute\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetYearDayScheduleCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH send Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetYearDayScheduleCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Create a user with userIndex as 5\n");
            err = TestCreateAUserWithUserIndexAs5_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends Clear Year Day Schedule to DUT\n");
            if (ShouldSkip("DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearYearDayScheduleToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetYearDayScheduleCommandToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Clear Year Day Schedule to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearYearDayScheduleToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Clear a year day schedule for the first user\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestClearAYearDayScheduleForTheFirstUser_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfYearDaySchedulesSupportedPerUser;

    CHIP_ERROR TestThReadsNumberOfYearDaySchedulesSupportedPerUserAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfYearDay SchedulesSupportedPerUser attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("numberOfYearDaySchedulesSupportedPerUser", [value unsignedCharValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("numberOfYearDaySchedulesSupportedPerUser", [value unsignedCharValue], 255U));
            {
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsers Supported attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:960UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:1980UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH sends Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 960UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 1980UL));
                                       }

                                       if (values.localEndTime != nil) {

                                           VerifyOrReturn(CheckConstraintMinValue<uint32_t>(
                                               "localEndTime", [values.localEndTime unsignedIntValue], 961UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetYearDayScheduleCommandToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:15U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1020UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:2040UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:15U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 133U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAUserWithUserIndexAs5_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:5U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create a user with userIndex as 5 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NumberOfYearDaySchedulesSupportedPerUser copy];
        params.userIndex = [NSNumber numberWithUnsignedShort:5U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(
                                               CheckValue("yearDayIndex", actualValue, NumberOfYearDaySchedulesSupportedPerUser));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 5U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearYearDayScheduleToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends Clear Year Day Schedule to DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1080UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:2100UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH sends Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("yearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("localStartTime", actualValue, 1080UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("localEndTime", actualValue, 2100UL));
                                       }

                                       if (values.localEndTime != nil) {

                                           VerifyOrReturn(CheckConstraintMinValue<uint32_t>(
                                               "localEndTime", [values.localEndTime unsignedIntValue], 1081UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearYearDayScheduleToDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Year Day Schedule to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAYearDayScheduleForTheFirstUser_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a year day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_9 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_9()
        : TestCommandBridge("Test_TC_DRLK_2_9")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_9() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_9\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_9\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user with default parameters\n");
            err = TestCreateNewUserWithDefaultParameters_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : TH reads NumberOfTotalUsersSupported attribute and saves for future use.\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttributeAndSavesForFutureUse_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response "
                "command with status as DUPLICATE or OCCUPIED\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithStatusAsDuplicateOrOccupied_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response "
                "command with response as OCCUPIED if the CredentialIndex is repeated\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential "
                "Response command with response as OCCUPIED if the CredentialIndex is repeated\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends Get Credential Status Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Set User Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C1a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetUserCommandToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Cleanup the first created user\n");
            err = TestCleanupTheFirstCreatedUser_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Cleanup the second created user\n");
            err = TestCleanupTheSecondCreatedUser_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUserWithDefaultParameters_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user with default parameters Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("userName", actualValue));
                                VerifyOrReturn(CheckValueAsString("userName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueId;
                                VerifyOrReturn(CheckValueNonNull("userUniqueId", actualValue));
                                VerifyOrReturn(CheckValue("userUniqueId", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("userStatus", actualValue));
                                VerifyOrReturn(CheckValue("userStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("userType", actualValue));
                                VerifyOrReturn(CheckValue("userType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("credentialRule", actualValue));
                                VerifyOrReturn(CheckValue("credentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttributeAndSavesForFutureUse_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsersSupported attribute and saves for future use. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("userIndex", actualValue));
                                            VerifyOrReturn(CheckValue("userIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("creatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("lastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"4321" length:4];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:5U];
        params.userType = [NSNumber numberWithUnsignedChar:10U];
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithStatusAsDuplicateOrOccupied_8()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_9()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_10()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommandToDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command to DUT Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetUserCommandToDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = @"xxx";
        params.userUniqueId = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends Set User Command to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("credentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("userIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("creatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("nextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:8U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheFirstCreatedUser_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the first created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheSecondCreatedUser_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the second created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class TestGroupsCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGroupsCluster()
        : TestCommandBridge("TestGroupsCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGroupsCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGroupsCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGroupsCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : View Group 0 (invalid)\n");
            err = TestViewGroup0Invalid_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : View First Group (not found)\n");
            err = TestViewFirstGroupNotFound_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Add First Group (no keys)\n");
            err = TestAddFirstGroupNoKeys_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Add KeySet\n");
            err = TestAddKeySet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write Group Keys\n");
            err = TestWriteGroupKeys_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Add First Group (new)\n");
            err = TestAddFirstGroupNew_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : View First Group (new)\n");
            err = TestViewFirstGroupNew_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : View Second Group (not found)\n");
            err = TestViewSecondGroupNotFound_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Get Group Membership 1 (all)\n");
            err = TestGetGroupMembership1All_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Add Second Group (new)\n");
            err = TestAddSecondGroupNew_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : View Second Group (new)\n");
            err = TestViewSecondGroupNew_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : View Group 3 (not found)\n");
            err = TestViewGroup3NotFound_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : View First Group (existing)\n");
            err = TestViewFirstGroupExisting_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : View Second Group (existing)\n");
            err = TestViewSecondGroupExisting_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Get Group Membership 2\n");
            err = TestGetGroupMembership2_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Remove Group 0 (invalid)\n");
            err = TestRemoveGroup0Invalid_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Remove Group 4 (not found)\n");
            err = TestRemoveGroup4NotFound_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove Second Group (existing)\n");
            err = TestRemoveSecondGroupExisting_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : View First Group (not removed)\n");
            err = TestViewFirstGroupNotRemoved_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : View Second Group (removed)\n");
            err = TestViewSecondGroupRemoved_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Get Group Membership 3\n");
            err = TestGetGroupMembership3_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Remove All\n");
            err = TestRemoveAll_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : View First Group (removed)\n");
            err = TestViewFirstGroupRemoved_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : View Second Group (still removed)\n");
            err = TestViewSecondGroupStillRemoved_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : View Group 3 (removed)\n");
            err = TestViewGroup3Removed_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Get Group Membership 4\n");
            err = TestGetGroupMembership4_26();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 27;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestViewGroup0Invalid_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:0U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 0 (invalid) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 135U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 0U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNotFound_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddFirstGroupNoKeys_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add First Group (no keys) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 126U));
                             }

                             {
                                 id actualValue = values.groupId;
                                 VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddKeySet_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:417U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:1110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:1110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:1110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Add KeySet Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeys_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddFirstGroupNew_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add First Group (new) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupId;
                                 VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNew_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (new) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("groupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupNotFound_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership1All_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 1 (all) Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("groupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 257U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddSecondGroupNew_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        params.groupName = @"Group #2";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Second Group (new) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupId;
                                 VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupNew_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (new) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("groupName", actualValue, @"Group #2"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewGroup3NotFound_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 3 (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 32767U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupExisting_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (existing) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("groupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupExisting_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (existing) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("groupName", actualValue, @"Group #2"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership2_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:259U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:32767U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 2 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("groupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 258U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup0Invalid_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:0U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 0 (invalid) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("status", actualValue, 135U));
                                }

                                {
                                    id actualValue = values.groupId;
                                    VerifyOrReturn(CheckValue("groupId", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup4NotFound_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:260U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 4 (not found) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("status", actualValue, 139U));
                                }

                                {
                                    id actualValue = values.groupId;
                                    VerifyOrReturn(CheckValue("groupId", actualValue, 260U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSecondGroupExisting_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Second Group (existing) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                }

                                {
                                    id actualValue = values.groupId;
                                    VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNotRemoved_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (not removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("groupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupRemoved_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership3_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:1U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:257U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[3] = [NSNumber numberWithUnsignedShort:3U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 3 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("groupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 257U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveAll_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Remove All Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupRemoved_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupStillRemoved_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (still removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewGroup3Removed_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 3 (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupId;
                                  VerifyOrReturn(CheckValue("groupId", actualValue, 32767U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership4_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:1U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:257U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[3] = [NSNumber numberWithUnsignedShort:3U];
            temp_0[4] = [NSNumber numberWithUnsignedShort:32767U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 4 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("groupList", [actualValue count], static_cast<uint32_t>(0)));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class TestGroupKeyManagementCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGroupKeyManagementCluster()
        : TestCommandBridge("TestGroupKeyManagementCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGroupKeyManagementCluster() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGroupKeyManagementCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGroupKeyManagementCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read maxGroupsPerFabric\n");
            err = TestReadMaxGroupsPerFabric_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read maxGroupKeysPerFabric\n");
            err = TestReadMaxGroupKeysPerFabric_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : KeySet Write 1\n");
            err = TestKeySetWrite1_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : KeySet Write 2\n");
            err = TestKeySetWrite2_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : KeySet Read\n");
            err = TestKeySetRead_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write Group Keys (invalid)\n");
            err = TestWriteGroupKeysInvalid_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write Group Keys (too many)\n");
            err = TestWriteGroupKeysTooMany_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Write Group Keys\n");
            err = TestWriteGroupKeys_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read Group Keys\n");
            err = TestReadGroupKeys_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Add Group 1\n");
            err = TestAddGroup1_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Add Group 2\n");
            err = TestAddGroup2_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read GroupTable\n");
            err = TestReadGroupTable_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : KeySet Remove 1\n");
            err = TestKeySetRemove1_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : KeySet Read (removed)\n");
            err = TestKeySetReadRemoved_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : KeySet Read (not removed)\n");
            err = TestKeySetReadNotRemoved_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Remove Group 1\n");
            err = TestRemoveGroup1_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read GroupTable 2\n");
            err = TestReadGroupTable2_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove All\n");
            err = TestRemoveAll_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read GroupTable 3\n");
            err = TestReadGroupTable3_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : KeySet Remove 2\n");
            err = TestKeySetRemove2_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : KeySet Read (also removed)\n");
            err = TestKeySetReadAlsoRemoved_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadMaxGroupsPerFabric_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupsPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read maxGroupsPerFabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxGroupsPerFabric", [value unsignedShortValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMaxGroupKeysPerFabric_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupKeysPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read maxGroupKeysPerFabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxGroupKeysPerFabric", [value unsignedShortValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite1_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:417U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:1110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:1110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:1110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 1 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite2_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:418U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:2110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:2110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:2110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 2 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRead_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          {
                              id actualValue = values.groupKeySet;
                              VerifyOrReturn(CheckValue("GroupKeySetID",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySetID, 417U));
                              VerifyOrReturn(CheckValue("GroupKeySecurityPolicy",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySecurityPolicy, 0U));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey0", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey0));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0));
                              VerifyOrReturn(CheckValue("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0, 1110000ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey1", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey1));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1));
                              VerifyOrReturn(CheckValue("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1, 1110001ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey2", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey2));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2));
                              VerifyOrReturn(CheckValue("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2, 1110002ULL));
                          }

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeysInvalid_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:0U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys (invalid) Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeysTooMany_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[3] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys (too many) Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_FAILURE));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeys_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupKeys_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupKeyMapWithParams:params
                                    completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                        NSLog(@"Read Group Keys Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = value;
                                            VerifyOrReturn(
                                                CheckValue("GroupKeyMap", [actualValue count], static_cast<uint32_t>(3)));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupId, 257U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupKeySetID,
                                                417U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupId, 258U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupKeySetID,
                                                417U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupId, 258U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupKeySetID,
                                                418U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).fabricIndex,
                                                1U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup1_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 1 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupId;
                                 VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup2_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        params.groupName = @"Group #2";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 2 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupId;
                                 VerifyOrReturn(CheckValue("groupId", actualValue, 258U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(2)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 257U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
                                               @"Group #1"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupId, 258U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRemove1_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"KeySet Remove 1 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadRemoved_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_NOT_FOUND));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadNotRemoved_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (not removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          {
                              id actualValue = values.groupKeySet;
                              VerifyOrReturn(CheckValue("GroupKeySetID",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySetID, 418U));
                              VerifyOrReturn(CheckValue("GroupKeySecurityPolicy",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySecurityPolicy, 1U));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey0", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey0));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0));
                              VerifyOrReturn(CheckValue("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0, 2110000ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey1", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey1));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1));
                              VerifyOrReturn(CheckValue("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1, 2110001ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey2", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey2));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2));
                              VerifyOrReturn(CheckValue("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2, 2110002ULL));
                          }

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup1_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 1 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("status", actualValue, 0U));
                                }

                                {
                                    id actualValue = values.groupId;
                                    VerifyOrReturn(CheckValue("groupId", actualValue, 257U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable2_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable 2 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 258U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveAll_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Remove All Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable3_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable 3 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(0)));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRemove2_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"KeySet Remove 2 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadAlsoRemoved_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                   endpointID:@(0)
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (also removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_NOT_FOUND));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_G_1_1()
        : TestCommandBridge("Test_TC_G_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_G_1_1() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_G_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_G_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !G.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given G.S.F00 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("G.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenGsf00EnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenGsf00EnsureFeaturemapHasTheCorrectBitSet_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given G.S.F00 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

#endif // CONFIG_ENABLE_YAML_TESTS

void registerCommandsTests(Commands & commands)
{
    const char * clusterName = "Tests";

    commands_list clusterCommands = {
#if CONFIG_ENABLE_YAML_TESTS
        make_unique<TestList>(),
        make_unique<ManualTestList>(),
        make_unique<TestAccessControlCluster>(),
        make_unique<Test_TC_ACL_1_1>(),
        make_unique<Test_TC_ACL_2_1>(),
        make_unique<Test_TC_ACL_2_2>(),
        make_unique<Test_TC_BOOL_1_1>(),
        make_unique<Test_TC_BOOL_2_1>(),
        make_unique<Test_TC_ACT_1_1>(),
        make_unique<Test_TC_BIND_1_1>(),
        make_unique<Test_TC_CC_1_1>(),
        make_unique<Test_TC_CC_2_1>(),
        make_unique<Test_TC_CC_3_2>(),
        make_unique<Test_TC_CC_3_3>(),
        make_unique<Test_TC_CC_4_1>(),
        make_unique<Test_TC_CC_4_2>(),
        make_unique<Test_TC_CC_4_3>(),
        make_unique<Test_TC_CC_4_4>(),
        make_unique<Test_TC_CC_5_1>(),
        make_unique<Test_TC_CC_5_2>(),
        make_unique<Test_TC_CC_5_3>(),
        make_unique<Test_TC_CC_6_1>(),
        make_unique<Test_TC_CC_7_3>(),
        make_unique<Test_TC_CC_7_4>(),
        make_unique<Test_TC_OPCREDS_1_2>(),
        make_unique<Test_TC_BINFO_1_1>(),
        make_unique<Test_TC_CNET_1_3>(),
        make_unique<Test_TC_DESC_1_1>(),
        make_unique<Test_TC_DLOG_1_1>(),
        make_unique<Test_TC_DGETH_1_1>(),
        make_unique<Test_TC_DGETH_2_1>(),
        make_unique<Test_TC_DGETH_2_2>(),
        make_unique<Test_TC_FLW_1_1>(),
        make_unique<Test_TC_FLW_2_1>(),
        make_unique<Test_TC_FLABEL_1_1>(),
        make_unique<Test_TC_CGEN_1_1>(),
        make_unique<Test_TC_CGEN_2_1>(),
        make_unique<Test_TC_DGGEN_1_1>(),
        make_unique<Test_TC_DGGEN_2_1>(),
        make_unique<Test_TC_I_1_1>(),
        make_unique<Test_TC_I_2_1>(),
        make_unique<Test_TC_I_2_2>(),
        make_unique<Test_TC_I_2_3>(),
        make_unique<Test_TC_ILL_1_1>(),
        make_unique<Test_TC_ILL_2_1>(),
        make_unique<Test_TC_ILL_2_2>(),
        make_unique<Test_TC_LVL_1_1>(),
        make_unique<Test_TC_LVL_2_1>(),
        make_unique<Test_TC_LVL_2_2>(),
        make_unique<Test_TC_LVL_3_1>(),
        make_unique<Test_TC_LVL_4_1>(),
        make_unique<Test_TC_LVL_5_1>(),
        make_unique<Test_TC_LVL_6_1>(),
        make_unique<Test_TC_LCFG_1_1>(),
        make_unique<Test_TC_LUNIT_1_2>(),
        make_unique<Test_TC_LTIME_1_2>(),
        make_unique<Test_TC_LOWPOWER_1_1>(),
        make_unique<Test_TC_KEYPADINPUT_1_2>(),
        make_unique<Test_TC_APPLAUNCHER_1_3>(),
        make_unique<Test_TC_MEDIAINPUT_1_4>(),
        make_unique<Test_TC_WAKEONLAN_1_5>(),
        make_unique<Test_TC_CHANNEL_1_6>(),
        make_unique<Test_TC_MEDIAPLAYBACK_1_7>(),
        make_unique<Test_TC_AUDIOOUTPUT_1_8>(),
        make_unique<Test_TC_TGTNAV_1_9>(),
        make_unique<Test_TC_TGTNAV_8_2>(),
        make_unique<Test_TC_APBSC_1_10>(),
        make_unique<Test_TC_CONTENTLAUNCHER_1_11>(),
        make_unique<Test_TC_ALOGIN_1_12>(),
        make_unique<Test_TC_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_PRS_2_2>(),
        make_unique<Test_TC_PCC_1_1>(),
        make_unique<Test_TC_PCC_2_1>(),
        make_unique<Test_TC_PCC_2_2>(),
        make_unique<Test_TC_PCC_2_3>(),
        make_unique<Test_TC_PCC_2_4>(),
        make_unique<Test_TC_PSCFG_1_1>(),
        make_unique<Test_TC_PSCFG_2_1>(),
        make_unique<Test_TC_RH_1_1>(),
        make_unique<Test_TC_RH_2_1>(),
        make_unique<Test_TC_SWTCH_1_1>(),
        make_unique<Test_TC_TMP_1_1>(),
        make_unique<Test_TC_TMP_2_1>(),
        make_unique<Test_TC_TSTAT_1_1>(),
        make_unique<Test_TC_TSUIC_1_1>(),
        make_unique<Test_TC_TSUIC_2_1>(),
        make_unique<Test_TC_TSUIC_2_2>(),
        make_unique<Test_TC_DGTHREAD_1_1>(),
        make_unique<Test_TC_ULABEL_1_1>(),
        make_unique<Test_TC_ULABEL_2_1>(),
        make_unique<Test_TC_ULABEL_2_2>(),
        make_unique<Test_TC_ULABEL_2_3>(),
        make_unique<Test_TC_ULABEL_2_4>(),
        make_unique<Test_TC_DGWIFI_1_1>(),
        make_unique<Test_TC_DGWIFI_2_1>(),
        make_unique<Test_TC_DGWIFI_2_3>(),
        make_unique<Test_TC_WNCV_1_1>(),
        make_unique<Test_TC_WNCV_2_1>(),
        make_unique<Test_TC_WNCV_2_2>(),
        make_unique<Test_TC_WNCV_2_3>(),
        make_unique<Test_TC_WNCV_2_4>(),
        make_unique<Test_TC_WNCV_2_5>(),
        make_unique<Test_TC_WNCV_3_1>(),
        make_unique<Test_TC_WNCV_3_2>(),
        make_unique<Test_TC_WNCV_3_3>(),
        make_unique<Test_TC_WNCV_3_4>(),
        make_unique<Test_TC_WNCV_3_5>(),
        make_unique<Test_TC_WNCV_4_1>(),
        make_unique<Test_TC_WNCV_4_2>(),
        make_unique<Test_TC_WNCV_4_3>(),
        make_unique<Test_TC_WNCV_4_4>(),
        make_unique<Test_TC_WNCV_4_5>(),
        make_unique<TV_TargetNavigatorCluster>(),
        make_unique<TV_AudioOutputCluster>(),
        make_unique<TV_ApplicationLauncherCluster>(),
        make_unique<TV_KeypadInputCluster>(),
        make_unique<TV_AccountLoginCluster>(),
        make_unique<TV_WakeOnLanCluster>(),
        make_unique<TV_ApplicationBasicCluster>(),
        make_unique<TV_MediaPlaybackCluster>(),
        make_unique<TV_ChannelCluster>(),
        make_unique<TV_LowPowerCluster>(),
        make_unique<TV_ContentLauncherCluster>(),
        make_unique<TV_MediaInputCluster>(),
        make_unique<TestCASERecovery>(),
        make_unique<TestCluster>(),
        make_unique<TestConstraints>(),
        make_unique<TestDelayCommands>(),
        make_unique<TestLogCommands>(),
        make_unique<TestSaveAs>(),
        make_unique<TestConfigVariables>(),
        make_unique<TestDescriptorCluster>(),
        make_unique<TestBasicInformation>(),
        make_unique<TestFabricRemovalWhileSubscribed>(),
        make_unique<TestGeneralCommissioning>(),
        make_unique<TestIdentifyCluster>(),
        make_unique<TestOperationalCredentialsCluster>(),
        make_unique<TestModeSelectCluster>(),
        make_unique<TestSelfFabricRemoval>(),
        make_unique<TestSystemCommands>(),
        make_unique<TestBinding>(),
        make_unique<TestUserLabelCluster>(),
        make_unique<TestUserLabelClusterConstraints>(),
        make_unique<TestArmFailSafe>(),
        make_unique<TestFanControl>(),
        make_unique<TestAccessControlConstraints>(),
        make_unique<TestLevelControlWithOnOffDependency>(),
        make_unique<TestCommissioningWindow>(),
        make_unique<TestMultiAdmin>(),
        make_unique<Test_TC_DGSW_1_1>(),
        make_unique<TestSubscribe_OnOff>(),
        make_unique<DL_UsersAndCredentials>(),
        make_unique<DL_LockUnlock>(),
        make_unique<DL_Schedules>(),
        make_unique<Test_TC_DRLK_1_1>(),
        make_unique<Test_TC_DRLK_2_2>(),
        make_unique<Test_TC_DRLK_2_3>(),
        make_unique<Test_TC_DRLK_2_4>(),
        make_unique<Test_TC_DRLK_2_5>(),
        make_unique<Test_TC_DRLK_2_7>(),
        make_unique<Test_TC_DRLK_2_9>(),
        make_unique<TestGroupsCluster>(),
        make_unique<TestGroupKeyManagementCluster>(),
        make_unique<Test_TC_G_1_1>(),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
