Fix status code in CommandDataElement (#5792)

Summary of Changes:

-- Per IM spec, status element in IM is TLV Array instead of struct.
-- Remove extra clusterId in status element
-- Add IM status code unit test.
diff --git a/src/app/tests/TestMessageDef.cpp b/src/app/tests/TestMessageDef.cpp
index f0c4680..0b53c06 100644
--- a/src/app/tests/TestMessageDef.cpp
+++ b/src/app/tests/TestMessageDef.cpp
@@ -578,6 +578,35 @@
     }
 }
 
+void BuildCommandDataElementWithStatusCode(nlTestSuite * apSuite, CommandDataElement::Builder & aCommandDataElementBuilder)
+{
+    CommandPath::Builder commandPathBuilder = aCommandDataElementBuilder.CreateCommandPathBuilder();
+    NL_TEST_ASSERT(apSuite, aCommandDataElementBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandPath(apSuite, commandPathBuilder);
+
+    StatusElement::Builder statusElementBuilder = aCommandDataElementBuilder.CreateStatusElementBuilder();
+    NL_TEST_ASSERT(apSuite, statusElementBuilder.GetError() == CHIP_NO_ERROR);
+    BuildStatusElement(apSuite, statusElementBuilder);
+
+    aCommandDataElementBuilder.EndOfCommandDataElement();
+    NL_TEST_ASSERT(apSuite, aCommandDataElementBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseCommandDataElementWithStatusCode(nlTestSuite * apSuite, CommandDataElement::Parser & aCommandDataElementParser)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    CommandPath::Parser commandPathParser;
+    StatusElement::Parser statusElementParser;
+    err = aCommandDataElementParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    err = aCommandDataElementParser.GetCommandPath(&commandPathParser);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    err = aCommandDataElementParser.GetStatusElement(&statusElementParser);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+}
+
 void BuildCommandList(nlTestSuite * apSuite, CommandList::Builder & aCommandListBuilder)
 {
     CommandDataElement::Builder commandDataElementBuilder = aCommandListBuilder.CreateCommandDataElementBuilder();
@@ -1077,6 +1106,30 @@
     ParseCommandDataElement(apSuite, commandDataElementParser);
 }
 
+void CommandDataElementWithStatusCodeTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    CommandDataElement::Builder commandDataElementBuilder;
+    CommandDataElement::Parser commandDataElementParser;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    commandDataElementBuilder.Init(&writer);
+    BuildCommandDataElementWithStatusCode(apSuite, commandDataElementBuilder);
+    chip::System::PacketBufferHandle buf;
+    err = writer.Finalize(&buf);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    DebugPrettyPrint(buf);
+
+    reader.Init(std::move(buf));
+    err = reader.Next();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    commandDataElementParser.Init(reader);
+    ParseCommandDataElementWithStatusCode(apSuite, commandDataElementParser);
+}
+
 void CommandListTest(nlTestSuite * apSuite, void * apContext)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1226,6 +1279,7 @@
                 NL_TEST_DEF("AttributeDataListTest", AttributeDataListTest),
                 NL_TEST_DEF("AttributeDataVersionListTest", AttributeDataVersionListTest),
                 NL_TEST_DEF("CommandDataElementTest", CommandDataElementTest),
+                NL_TEST_DEF("CommandDataElementWithStatusCodeTest", CommandDataElementWithStatusCodeTest),
                 NL_TEST_DEF("CommandListTest", CommandListTest),
                 NL_TEST_DEF("ReportDataTest", ReportDataTest),
                 NL_TEST_DEF("InvokeCommandTest", InvokeCommandTest),