/// <summary>
        /// Verify RopCopyToStream Null Destination Failure Response
        /// </summary>
        /// <param name="ropCopyToStreamResponse">The null destination failure response of RopCopyToStream request</param>
        /// <param name="sourceHandleIndex">The field of SourceHandleIndex in RopCopyToStream request</param>
        /// <param name="destHandleIndex">The field of DestHandleIndex in RopCopyToStream request</param>
        private void VerifyRopCopyToStreamNullDestinationFailureResponse(RopCopyToStreamResponse ropCopyToStreamResponse, byte sourceHandleIndex, uint destHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R3392");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3392
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCopyToStreamResponse.RopId.GetType(),
                3392,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]RopId (1 byte): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3394
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopCopyToStream,
                ropCopyToStreamResponse.RopId,
                3394,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer,RopId (1 byte)]For this operation[RopCopyToStream], this field is set to 0x3A.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3395
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCopyToStreamResponse.SourceHandleIndex.GetType(),
                3395,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]SourceHandleIndex (1 byte): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3396
            Site.CaptureRequirementIfAreEqual<byte>(
                sourceHandleIndex,
                ropCopyToStreamResponse.SourceHandleIndex,
                3396,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer,SourceHandleIndex (1 byte)]This index MUST be set to the value specified in the SourceHandleIndex field in the request.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3398
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCopyToStreamResponse.ReturnValue.GetType(),
                3398,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3400
            Site.CaptureRequirementIfAreEqual<uint>(
                ReturnValueForRopMoveFolderResponseAndMoveCopyMessage,
                ropCopyToStreamResponse.ReturnValue,
                3400,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer,ReturnValue (4 bytes)]For this response[Null Destination Failure Response], this field is set to 0x00000503.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3401
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCopyToStreamResponse.DestHandleIndex.GetType(),
                3401,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]DestHandleIndex (4 bytes): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3402
            Site.CaptureRequirementIfAreEqual<uint>(
                destHandleIndex,
                ropCopyToStreamResponse.DestHandleIndex,
                3402,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer,DestHandleIndex (4 bytes)]This index MUST be set to the specified in the DestHandleIndex field in the request.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3404
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(ulong),
                ropCopyToStreamResponse.ReadByteCount.GetType(),
                3404,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]ReadByteCount (8 bytes): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3412
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(ulong),
                ropCopyToStreamResponse.WrittenByteCount.GetType(),
                3412,
                @"[In RopCopyToStream ROP Null Destination Failure Response Buffer]WrittenByteCount (8 bytes): An unsigned integer.");

            if (Common.IsRequirementEnabled(3411, this.Site))
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R3411,the ReadByteCount:{0}", ropCopyToStreamResponse.ReadByteCount);

                // Verify MS-OXCROPS requirement: 3411
                Site.CaptureRequirementIfAreEqual<ulong>(
                    ReadOrWrittenByteCountForRopCopyToStream,
                    ropCopyToStreamResponse.ReadByteCount,
                    3411,
                    @"[In Appendix B: Product Behavior] For this response [of read from the source object ] , Implementation does set this field[ReadByteCount] to 0x0000000000000000. (Microsoft Exchange Server 2010 and above follow this behavior.)");
            }

            if (Common.IsRequirementEnabled(4692, this.Site))
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4692");

                // Verify MS-OXCROPS requirement: MS-OXCROPS_R4692
                Site.CaptureRequirementIfAreNotEqual<ulong>(
                    ReadOrWrittenByteCountForRopCopyToStream,
                    ropCopyToStreamResponse.ReadByteCount,
                    4692,
                    @"[In Appendix B: Product Behavior] Implementation does not set the field[ReadByteCount] to 0x0000000000000000, but the non zero value has no meaning.  (<11> Section 2.2.9.8.3: Exchange 2007 do not set the field to 0x0000000000000000, but the nonzero value has no meaning.)");
            }

            if (Common.IsRequirementEnabled(3415, this.Site))
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R3415,the WrittenByteCount:{0}", ropCopyToStreamResponse.WrittenByteCount);

                // Verify MS-OXCROPS requirement: 3415
                Site.CaptureRequirementIfAreEqual<ulong>(
                    ReadOrWrittenByteCountForRopCopyToStream,
                    ropCopyToStreamResponse.WrittenByteCount,
                    3415,
                    @"[In Appendix B: Product Behavior] For this response [of written to the destination object], Implementation does set this field[WrittenByteCount] to 0x0000000000000000. (Microsoft Exchange Server 2010 and above follow this behavior.)");
            }

            if (Common.IsRequirementEnabled(4693, this.Site))
            {
                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4693");

                // Verify MS-OXCROPS requirement: MS-OXCROPS_R4693
                Site.CaptureRequirementIfAreNotEqual<ulong>(
                    ReadOrWrittenByteCountForRopCopyToStream,
                    ropCopyToStreamResponse.WrittenByteCount,
                    4693,
                    @"[In Appendix B: Product Behavior] Implementation does not set the field[WrittenByteCount] to 0x0000000000000000, but the non zero value has no meaning. (<12> Section 2.2.9.8.3: Exchange 2007 do not set the field to 0x0000000000000000, but the nonzero value has no meaning.)");
            }
        }
        /// <summary>
        /// Verify the RopCopyToStream operation related requirements.
        /// </summary>
        /// <param name="ropCopyToStreamResponse">The RopCopyToStream response buffer structure.</param>
        /// <param name="isDestinationExist">A boolean value indicates if the destination object exists or not</param>
        /// <param name="isCopyRightDataCount">Indicates if the number of properties to be copied is right or not.</param>
        /// <param name="destHandleIsRight">Indicates if the DestHandleIndex is right or not.</param>
        private void VerifyRopCopyToStream(RopCopyToStreamResponse ropCopyToStreamResponse, bool isDestinationExist, bool isCopyRightDataCount, bool destHandleIsRight)
        {
            // Since the RopCopyToStream ROP response was parsed successfully, MS-OXCPRPT_R76002 can be captured directly.
            Site.CaptureRequirement(
                76002,
                @"[In Processing RopCopyToStream] The server responds with a RopCopyToStream ROP response buffer.");

            if (isDestinationExist)
            {
                Site.CaptureRequirementIfIsTrue(
                    isCopyRightDataCount,
                    34902,
                    @"[In RopCopyToStream ROP Response Buffer] WrittenByteCount: An integer that specifies the number of bytes written to the destination stream. ");
            }

            if (ropCopyToStreamResponse.ReturnValue.Equals((uint)CPRPTErrorCode.None))
            {
                // If this operation is performed successfully, that means this operation is valid on Stream objects.
                Site.CaptureRequirement(
                    34301,
                    @"[In RopCopyToStream ROP] This operation is valid on Stream objects.");

                // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                Site.CaptureRequirement(
                    35101,
                    @"[In RopCopyToStream ROP Response Buffer] DestHandleIndex (4 bytes): An integer.");

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

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

                // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R591
                // ReadByteCount specifies the number of BYTES read from the source object while WrittenByteCount specifies the number of BYTES written to the destination object.
                // When this operation is performed successfully, if ReadByteCount equals WrittenByteCount, it means the position of destination streams is moved forward the same bytes as the source streams.
                Site.CaptureRequirementIfAreEqual<ulong>(
                    ropCopyToStreamResponse.WrittenByteCount,
                    ropCopyToStreamResponse.ReadByteCount,
                    591,
                    @"[In Processing RopCopyToStream] The server MUST move the seek pointer of both the source and destination streams forward the same number of bytes as were copied.");
            }

            if (!ropCopyToStreamResponse.ReturnValue.Equals((uint)CPRPTErrorCode.NullDestinationObject))
            {
                // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R352
                // The value of DestHandleIndex is 0 means this field is not present.
                Site.CaptureRequirementIfAreEqual<uint>(
                    0,
                    ropCopyToStreamResponse.DestHandleIndex,
                    352,
                    @"[In RopCopyToStream ROP Response Buffer] DestHandleIndex: The DestHandleIndex field MUST NOT be present if the ReturnValue field is set to any value other than NullDestinationObject (0x00000503).");
            }
            else
            {
                // The parser has ensured the field satisfied the format, otherwise the response cannot be received.
                Site.CaptureRequirementIfIsTrue(
                    destHandleIsRight,
                    351,
                    @"[In RopCopyToStream ROP Response Buffer] DestHandleIndex: The DestHandleIndex field MUST be set to the value of the DestHandleIndex field of the ROP request buffer.");
            }

            if (!isDestinationExist)
            {
                if (Common.IsRequirementEnabled(895, this.Site))
                {
                    // Verify MS-OXCPRPT requirement: MS-OXCPRPT_R895
                    Site.CaptureRequirementIfAreEqual<uint>(
                        (uint)CPRPTErrorCode.NullDestinationObject,
                        ropCopyToStreamResponse.ReturnValue,
                        895,
                        @"[In Processing RopCopyToStream] Implementation does return error code ""0x00000503"" with name ""NullDestinationObject"", when Destination object does not exist.(Microsoft Exchange Server 2007 and above follow this behavior)");
                }
            }
        }
        /// <summary>
        /// Verify RopCopyToStream Response
        /// </summary>
        /// <param name="ropCopyToStreamResponse">The response of RopCopyToStream request</param>
        /// <param name="sourceHandleIndex">The field of SourceHandleIndex in RopCopyToStream request</param>
        private void VerifyRopCopyToStreamResponse(RopCopyToStreamResponse ropCopyToStreamResponse, byte sourceHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R3379");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3379
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCopyToStreamResponse.RopId.GetType(),
                3379,
                @"[In RopCopyToStream ROP Response Buffer]RopId (1 byte): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3381
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopCopyToStream,
                ropCopyToStreamResponse.RopId,
                3381,
                @"[In RopCopyToStream ROP Response Buffer,RopId (1 byte)]For this operation[RopCopyToStream], this field is set to 0x3A.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3382
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCopyToStreamResponse.SourceHandleIndex.GetType(),
                3382,
                @"[In RopCopyToStream ROP Response Buffer]SourceHandleIndex (1 byte): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3383
            Site.CaptureRequirementIfAreEqual<byte>(
                sourceHandleIndex,
                ropCopyToStreamResponse.SourceHandleIndex,
                3383,
                @"[In RopCopyToStream ROP Response Buffer,SourceHandleIndex (1 byte)]This index MUST be set to the value specified in the SourceHandleIndex field in the request.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3385
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCopyToStreamResponse.ReturnValue.GetType(),
                3385,
                @"[In RopCopyToStream ROP Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3387
            Site.CaptureRequirementIfAreNotEqual<uint>(
                ReturnValueForRopMoveFolderResponseAndMoveCopyMessage,
                ropCopyToStreamResponse.ReturnValue,
                3387,
                @"[In RopCopyToStream ROP Response Buffer,ReturnValue (4 bytes)]For this response[except Null Destination Failure Response ], this field is set to a value other than 0x00000503.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3388
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(ulong),
                ropCopyToStreamResponse.ReadByteCount.GetType(),
                3388,
                @"[In RopCopyToStream ROP Response Buffer]ReadByteCount (8 bytes): An unsigned integer.");

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

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R3390
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(ulong),
                ropCopyToStreamResponse.WrittenByteCount.GetType(),
                3390,
                @"[In RopCopyToStream ROP Response Buffer]WrittenByteCount (8 bytes): An unsigned integer.");
        }