/// <summary>
        /// Verify RopGetNamesFromPropertyIds Failure Response
        /// </summary>
        /// <param name="ropGetNamesFromPropertyIdsResponse">The failure response of RopGetNamesFromPropertyIds request</param>
        /// <param name="inputHandleIndex">The field of InputHandleIndex in RopGetNamesFromPropertyIds request</param>
        private void VerifyRopGetNamesFromPropertyIdsFailureResponse(RopGetNamesFromPropertyIdsResponse ropGetNamesFromPropertyIdsResponse, byte inputHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2664");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2664
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropGetNamesFromPropertyIdsResponse.RopId.GetType(),
                2664,
                @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer]RopId (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2666");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2666
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopGetNamesFromPropertyIds,
                ropGetNamesFromPropertyIdsResponse.RopId,
                2666,
                @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer,RopId (1 byte)]For this operation[RopGetNamesFromPropertyIds], this field is set to 0x55.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2667");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2667
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropGetNamesFromPropertyIdsResponse.InputHandleIndex.GetType(),
                2667,
                @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer]InputHandleIndex (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2668");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2668
            Site.CaptureRequirementIfAreEqual<byte>(
                inputHandleIndex,
                ropGetNamesFromPropertyIdsResponse.InputHandleIndex,
                2668,
                @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer,InputHandleIndex (1 byte)]This index MUST be set to the value specified in the InputHandleIndex field in the request.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2670");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2670
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropGetNamesFromPropertyIdsResponse.ReturnValue.GetType(),
                2670,
                @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

            // Refer to MS-OXCROPS: For some ROPs, Exchange 2003 and Exchange 2007 use different methods to resolve 
            // the Server object and, therefore, do not fail the ROP if the index is invalid.
            if (Common.IsRequirementEnabled(4713, this.Site))
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4713");

                // Verify MS-OXCROPS requirement: MS-OXCROPS_R4713
                Site.CaptureRequirementIfAreEqual<uint>(
                    SuccessReturnValue,
                    ropGetNamesFromPropertyIdsResponse.ReturnValue,
                    4713,
                    @"[In Appendix B: Product Behavior] For some ROPs, Implementation does use different methods to resolve the Server object and, therefore, do not fail the ROP if the index is invalid. (<23> Section 3.2.5.1: For some ROPs, Exchange 2007 use different methods to resolve the Server object and, therefore, do not fail the ROP if the index is invalid.)");
            }
            else
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2672");

                // Verify MS-OXCROPS requirement: MS-OXCROPS_R2672
                Site.CaptureRequirementIfAreNotEqual<uint>(
                    SuccessReturnValue,
                    ropGetNamesFromPropertyIdsResponse.ReturnValue,
                    2672,
                    @"[In RopGetNamesFromPropertyIds ROP Failure Response Buffer,ReturnValue (4 bytes)]For this response[Failure Response], this field is set to a value other than 0x00000000.");
            }
        }
        /// <summary>
        /// Verify the RopGetNamesFromPropertyIds operation related requirements.
        /// </summary>
        /// <param name="propertyIdCount">The PropertyIdCount parameter in the request buffer which indicates the number of PropertyId.</param>
        /// <param name="propertyIds">A list of PropertyId in the request buffer.</param>
        /// <param name="ropGetNamesFromPropertyIdsResponse">The RopGetNamesFromPropertyIds response buffer structure.</param>
        /// <param name="objectType">Indicates which object type the RopGetNamesFromPropertyIds operation is acting on.</param>
        private void VerifyRopGetNamesFromPropertyIds(
            ushort propertyIdCount,
            PropertyId[] propertyIds,
            RopGetNamesFromPropertyIdsResponse ropGetNamesFromPropertyIdsResponse,
            ServerObjectType objectType)
        {
            // Since the RopGetNamesFromPropertyIds ROP response was parsed successfully, MS-OXCPRPT_R51802 can be captured directly.
            Site.CaptureRequirement(
                51802,
                @"[In Processing RopGetNamesFromPropertyIds] The server responds with a RopGetNamesFromPropertyIds ROP response buffer.");

            if (ropGetNamesFromPropertyIdsResponse.ReturnValue.Equals((uint)CPRPTErrorCode.None))
            {
                if (objectType == ServerObjectType.Message)
                {
                    // If the object type this operation acting on is Message object and this operation is performed successfully, then the following requirement can be captured.
                    Site.CaptureRequirement(
                        23701,
                        @"[In RopGetNamesFromPropertyIds ROP] This operation [RopGetNamesFromPropertyIds ROP] is valid on Message objects.");
                }

                if (objectType == ServerObjectType.Folder)
                {
                    // If the object type this operation acting on is Folder object and this operation is performed successfully, then the following requirement can be captured.
                    Site.CaptureRequirement(
                        23703,
                        @"[In RopGetNamesFromPropertyIds ROP] This operation [RopGetNamesFromPropertyIds ROP] is valid on Folder objects.");
                }

                if (objectType == ServerObjectType.Attachment)
                {
                    // If the object type this operation acting on is Attachment object and this operation is performed successfully, then the following requirement can be captured.
                    Site.CaptureRequirement(
                        23702,
                        @"[In RopGetNamesFromPropertyIds ROP] This operation [RopGetNamesFromPropertyIds ROP] is valid on Attachment objects.");
                }

                if (objectType == ServerObjectType.Logon)
                {
                    // If the object type this operation acting on is Logon object and this operation is performed successfully, then the following requirement can be captured.
                    Site.CaptureRequirement(
                        23704,
                        @"[In RopGetNamesFromPropertyIds ROP] This operation [RopGetNamesFromPropertyIds ROP] is valid on Logon objects.");
                }

                // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                Site.CaptureRequirement(
                  248,
                  @"[In RopGetNamesFromPropertyIds ROP Response Buffer] PropertyNameCount: 2 bytes integer.");

                if (ropGetNamesFromPropertyIdsResponse.PropertyNameCount != 0)
                {
                    // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                    Site.CaptureRequirement(
                          250,
                          @"[In RopGetNamesFromPropertyIds ROP Response Buffer] PropertyNames (variable): An array of PropertyName structures ([MS-OXCDATA] section 2.6).");
                }

                // Add the debug information
                Site.Log.Add(
                    LogEntryKind.Debug,
                    "Verify MS-OXCPRPT_R658, PropertyNameCount is {0}, ProertyNames is {1}",
                    ropGetNamesFromPropertyIdsResponse.PropertyNameCount,
                    ropGetNamesFromPropertyIdsResponse.PropertyNames);
            }

            // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R249
            Site.CaptureRequirementIfAreEqual<ushort>(
                propertyIdCount,
                ropGetNamesFromPropertyIdsResponse.PropertyNameCount,
                249,
                @"[In RopGetNamesFromPropertyIds ROP Response Buffer] PropertyNameCount: This value MUST be equal to the value of the PropertyIdCount field of the ROP request buffer. ");

            Site.CaptureRequirementIfAreEqual<ushort>(
               propertyIdCount,
               (ushort)ropGetNamesFromPropertyIdsResponse.PropertyNames.Length,
               24802,
               @"[In RopGetNamesFromPropertyIds ROP Response Buffer] propertyNameCount: An integer that specifies the number of structures contained in the PropertyNames field. ");

            // Examine each property ID in the request message and each associated PropertyName in the response message.The order of the ID and Name matches.
            for (int i = 0; i < propertyIds.Length; i++)
            {
                if (propertyIds[i].ID < 0x8000)
                {
                    // Add the debug information
                    Site.Log.Add(
                        LogEntryKind.Debug,
                        "Verify MS-OXCPRPT_R518,The PropertyId requested is {0}, The GUID response in PropertyName is {1}, The expected value of GUID is {2}",
                        propertyIds[i].ID,
                        ropGetNamesFromPropertyIdsResponse.PropertyNames[i].Guid.ToString(),
                        this.valuePSMAPI.ToString());

                    // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R518
                    // Check whether the PropertyName's GUID is PS-MAPI
                    bool isVerifyR518 = Common.CompareByteArray(ropGetNamesFromPropertyIdsResponse.PropertyNames[i].Guid, this.valuePSMAPI);

                    Site.CaptureRequirementIfIsTrue(
                        isVerifyR518,
                        518,
                        @"[In Processing RopGetNamesFromPropertyIds] For each property ID in the PropertyIds field of the ROP request buffer, the server MUST perform the following: If the property ID is less than 0x8000, the associated PropertyName structure ([MS-OXCDATA] section 2.6.1) contained in the PropertyNames field of the ROP response buffer MUST be composed as follows: The structure's GUID field is set to the PS_MAPI property set ([MS-OXPROPS] section 1.3.2).");

                    // Add the debug information
                    Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCPRPT_R519");

                    Site.CaptureRequirementIfAreEqual<byte>(
                        0x00,
                        ropGetNamesFromPropertyIdsResponse.PropertyNames[i].Kind,
                        519,
                        @"[In Processing RopGetNamesFromPropertyIds] For each property ID in the PropertyIds field of the ROP request buffer, the server MUST perform the following: If the property ID is less than 0x8000, the associated PropertyName structure ([MS-OXCDATA] section 2.6.1) contained in the PropertyNames field of the ROP response buffer MUST be composed as follows:: The structure's Kind field is set to 0x00.");

                    // Add the debug information
                    Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCPRPT_R520");

                    Site.CaptureRequirementIfAreEqual<uint>(
                        (uint)propertyIds[i].ID,
                        (uint)ropGetNamesFromPropertyIdsResponse.PropertyNames[i].LID,
                        520,
                        @"[In Processing RopGetNamesFromPropertyIds] For each property ID in the PropertyIds field of the ROP request buffer, the server MUST perform the following: If the property ID is less than 0x8000, the associated PropertyName structure ([MS-OXCDATA] section 2.6.1) contained in the PropertyNames field of the ROP response buffer MUST be composed as follows:: The structure's LID field is set to the property ID.");
                }
            }

            bool isCDATAR25Valid = true;
            bool isCDATAR27Valid = true;
            foreach (PropertyName propertyName in ropGetNamesFromPropertyIdsResponse.PropertyNames)
            {
                // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                Site.CaptureRequirement(
                    "MS-OXCDATA",
                    30,
                    @"[In PropertyName Structure] Name (optional) (variable):  The value is a Unicode (UTF-16 format) string, followed by two zero bytes as terminating null characters, that identifies the property within its property set.");

                Site.CaptureRequirementIfIsNotNull(
                    propertyName.Guid,
                    "MS-OXCDATA",
                    21,
                    @"[In PropertyName Structure] GUID (16 bytes):  The GUID that identifies the property set for the named property.");

                // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                Site.CaptureRequirement(
                    "MS-OXCDATA",
                    26,
                    @"[In PropertyName Structure] LID (optional) (4 bytes):  An unsigned integer that identifies the named property within its property set.");

                if ((propertyName.LID != 0x00 && propertyName.Kind != 0x00) || ((propertyName.Kind == 0x01 || propertyName.Kind == 0x0ff) && propertyName.LID != 0x00))
                {
                    isCDATAR25Valid = false;
                }

                if ((propertyName.NameSize != null && propertyName.Kind != 0x01) || ((propertyName.Kind == 0x00 || propertyName.Kind == 0x0ff) && propertyName.NameSize != null))
                {
                    isCDATAR27Valid = false;
                }
            }

            Site.CaptureRequirementIfIsTrue(
                isCDATAR25Valid,
                "MS-OXCDATA",
                25,
                @"[In PropertyName Structure] LID (optional) (4 bytes): This field is present only if the value of the Kind field is equal to 0x00.");

            Site.CaptureRequirementIfIsTrue(
               isCDATAR27Valid,
               "MS-OXCDATA",
               27,
               @"[In PropertyName Structure] NameSize (optional) (1 byte):  This field is present only if the value of the Kind field is equal to 0x01.");

            Site.CaptureRequirementIfIsTrue(
               isCDATAR27Valid,
               "MS-OXCDATA",
               29,
               @"[In PropertyName Structure] Name (optional) (variable): This field is present only if Kind is equal to 0x01.");

            // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R521
            // The property ID values has been verified that have an associated PropertyName.
            // Server will set the PropertyName value according to the PropertyId. So if the returned PropertyNames is not null, this requirement can be verified.
            Site.CaptureRequirementIfIsNotNull(
                ropGetNamesFromPropertyIdsResponse.PropertyNames,
                521,
                @"[In Processing RopGetNamesFromPropertyIds] For each property ID in the PropertyIds field of the ROP request buffer, the server MUST perform the following: For property IDs that have an associated PropertyName structure, the server MUST return the PropertyName structure associated with the property ID.");

            // Since the RopGetNamesFromPropertyIds ROP response was parsed successfully, MS-OXCPRPT_R230 can be captured directly.
            Site.CaptureRequirement(
                230,
                @"[In RopGetNamesFromPropertyIds ROP] The RopGetNamesFromPropertyIds ROP ([MS-OXCROPS] section 2.2.8.2) maps concrete property IDs to abstract, client-defined named properties");
        }
        /// <summary>
        /// Verify RopGetNamesFromPropertyIds Success Response
        /// </summary>
        /// <param name="ropGetNamesFromPropertyIdsResponse">The success response of RopGetNamesFromPropertyIds request</param>
        /// <param name="inputHandleIndex">The field of InputHandleIndex in RopGetNamesFromPropertyIds request</param>
        private void VerifyRopGetNamesFromPropertyIdsSuccessResponse(RopGetNamesFromPropertyIdsResponse ropGetNamesFromPropertyIdsResponse, byte inputHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2649");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2649
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropGetNamesFromPropertyIdsResponse.RopId.GetType(),
                2649,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer]RopId (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2651");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2651
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopGetNamesFromPropertyIds,
                ropGetNamesFromPropertyIdsResponse.RopId,
                2651,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer,RopId (1 byte)] For this operation[RopGetNamesFromPropertyIds], this field is set to 0x55.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2652");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2652
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropGetNamesFromPropertyIdsResponse.InputHandleIndex.GetType(),
                2652,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer]InputHandleIndex (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2653");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2653
            Site.CaptureRequirementIfAreEqual<byte>(
                inputHandleIndex,
                ropGetNamesFromPropertyIdsResponse.InputHandleIndex,
                2653,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer,InputHandleIndex (1 byte)]This index MUST be set to the InputHandleIndex specified in the request.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2655");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2655
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropGetNamesFromPropertyIdsResponse.ReturnValue.GetType(),
                2655,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2657");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2657
            Site.CaptureRequirementIfAreEqual<uint>(
                SuccessReturnValue,
                ropGetNamesFromPropertyIdsResponse.ReturnValue,
                2657,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer,ReturnValue (4 bytes)]For this response[Success Response ], this field is set to 0x00000000.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2658");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2658
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(ushort),
                ropGetNamesFromPropertyIdsResponse.PropertyNameCount.GetType(),
                2658,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer]PropertyNameCount (2 bytes): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2660");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2660
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(PropertyName[]),
                ropGetNamesFromPropertyIdsResponse.PropertyNames.GetType(),
                2660,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer]PropertyNames (variable): A list of PropertyName structures.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2661");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2661
            Site.CaptureRequirementIfAreEqual<int>(
                ropGetNamesFromPropertyIdsResponse.PropertyNameCount,
                ropGetNamesFromPropertyIdsResponse.PropertyNames.Length,
                2661,
                @"[In RopGetNamesFromPropertyIds ROP Success Response Buffer,PropertyNames (variable)]The number of structures contained in this field is specified by the PropertyNameCount field.");
        }