/// <summary>
        /// This operation is used to restore the specified file to a specific version.
        /// </summary>
        /// <param name="fileName">The site-relative path of the file which will be restored.</param>
        /// <param name="fileVersion">The version number of the file which will be restored.</param>
        /// <returns>The response message for restoring the specified file to a specific version.</returns>
        public RestoreVersionResponseRestoreVersionResult RestoreVersion(string fileName, string fileVersion)
        {
            try
            {
                fileVersion = fileVersion.Replace("@", string.Empty);
                RestoreVersionResponseRestoreVersionResult restoreVersionResult = this.service.RestoreVersion(
                    fileName,
                    fileVersion);

                this.VerifyTransport();
                this.VerifySOAPVersion(this.service.SoapVersion);
                this.VerifyRestoreVersion(restoreVersionResult, SchemaValidation.LastRawResponseXml.OuterXml);
                return(restoreVersionResult);
            }
            catch (SoapException soapException)
            {
                this.VerifySOAPFaultDetails(soapException, SchemaValidation.LastRawResponseXml.OuterXml);
                throw;
            }
            catch (WebException)
            {
                this.VerifyServerFaults();
                throw;
            }
        }
        /// <summary>
        /// Verify the RestoreVersion operation related requirements.
        /// </summary>
        /// <param name="restoreVersionResult">The RestoreVersionResponseRestoreVersionResult object indicates
        /// RestoreVersion operation response.</param>
        /// <param name="soapBody">The string value indicates the SOAP body in RestoreVersion operation response.</param>
        private void VerifyRestoreVersion(RestoreVersionResponseRestoreVersionResult restoreVersionResult, string soapBody)
        {
            bool isSchemaVerified = SchemaValidation.ValidationResult.Equals(ValidationResult.Success);

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

            // Verify MS-VERSS requirement: MS-VERSS_R18701
            Site.CaptureRequirementIfIsTrue(
                isSchemaVerified,
                18701,
                @"[In RestoreVersion][The schema of GetVersions is defined as:] 
<wsdl:operation name=""RestoreVersion"">
    <wsdl:input message=""tns:RestoreVersionSoapIn"" />
    <wsdl:output message=""tns:RestoreVersionSoapOut"" />
</wsdl:operation>");
            #endregion

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

            // Verify MS-VERSS requirement: MS-VERSS_R141
            Site.CaptureRequirementIfIsNotNull(
                restoreVersionResult,
                141,
                @"[In RestoreVersion] [The protocol client sends a RestoreVersionSoapIn request message,] and the protocol server responds with a RestoreVersionSoapOut response message.");
            #endregion

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

            bool isR147Verified = AdapterHelper.IsExistElementInSoapBody(soapBody, "RestoreVersionResponse");

            // Verify MS-VERSS requirement: MS-VERSS_R147
            Site.CaptureRequirementIfIsTrue(
                isR147Verified,
                147,
                @"[In RestoreVersionSoapOut] The SOAP body contains a RestoreVersionResponse element.");
            #endregion

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

            // Verify MS-VERSS requirement: MS-VERSS_R151
            Site.CaptureRequirementIfIsTrue(
                isSchemaVerified,
                151,
                @"[In RestoreVersionResponse][The schema of RestoreVersionResponse element is defined as:]  
<s:element name=""RestoreVersionResponse"">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs=""1"" maxOccurs=""1"" name=""RestoreVersionResult"">
        <s:complexType>
          <s:sequence>
            <s:element name=""results"" minOccurs=""1"" maxOccurs=""1"" type=""tns:Results"" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
</s:element>");
            #endregion

            this.VerifyResultsComplexType(restoreVersionResult.results, isSchemaVerified);
        }
        public void MSVERSS_S02_TC03_RestoreVersionWithoutEnforceCheckout()
        {
            // Enable the versioning of the list.
            bool setVersioning = this.sutControlAdapterInstance.SetVersioning(this.documentLibrary, true, true);

            Site.Assert.IsTrue(
                setVersioning,
                "SetVersioning operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                setVersioning);

            // Protocol server does not enforce that only checked out files can be modified.
            bool isSetServerEnforceCheckOut = this.sutControlAdapterInstance.SetEnforceCheckout(this.documentLibrary, false);

            Site.Assert.IsTrue(
                isSetServerEnforceCheckOut,
                "SetServerEnforceCheckOut operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isSetServerEnforceCheckOut);

            // Upload the first file into specific list.
            bool isAddFileSuccessful = this.sutControlAdapterInstance.AddFile(this.documentLibrary, this.fileName, TestSuiteHelper.UploadFileName);

            Site.Assert.IsTrue(
                isAddFileSuccessful,
                "AddFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isAddFileSuccessful);

            // Check out and check in first file to add the file versions.
            this.testSuiteHelper.AddOneFileVersion(this.fileName);

            // Call GetVersions operation using absolute fileName.
            GetVersionsResponseGetVersionsResult getVersionsResponse = this.protocolAdapterInstance.GetVersions(this.fileAbsoluteUrl.AbsoluteUri);

            // Verify the GetVersions results.
            this.testSuiteHelper.VerifyResultsInformation(getVersionsResponse.results, OperationName.GetVersions, true);

            // Get the current version.
            string currentVersionBeforeRestore = AdapterHelper.GetCurrentVersion(getVersionsResponse.results.result);

            // Get the previous version which is specific to be restored.
            string restoreVersion = AdapterHelper.GetPreviousVersion(getVersionsResponse.results.result);

            // Call RestoreVersion operation using absolute fileName and restore a specified file to a specific version.
            RestoreVersionResponseRestoreVersionResult restoreVersionNotCheckOutResponse =
                this.protocolAdapterInstance.RestoreVersion(this.fileAbsoluteUrl.AbsoluteUri, restoreVersion);

            // Verify the RestoreVersion results.
            this.testSuiteHelper.VerifyResultsInformation(restoreVersionNotCheckOutResponse.results, OperationName.RestoreVersion, true);

            // Get the current version in RestoreVersion response.
            string currentVersionAfterNotCheckOutRestore = AdapterHelper.GetCurrentVersion(
                restoreVersionNotCheckOutResponse.results.result);

            // Verify whether the current version after RestoreVersion is increased when the file is not checked out.
            bool isCurrentVersionIncreased = AdapterHelper.IsCurrentVersionIncreased(
                currentVersionBeforeRestore,
                currentVersionAfterNotCheckOutRestore);

            // Add the debug information
            Site.Log.Add(
                LogEntryKind.Debug,
                "Verify MS-VERSS_R185, if the file is not checked out, the current version before RestoreVersion is {0}," +
                " and after RestoreVersion is {1}",
                currentVersionBeforeRestore,
                currentVersionAfterNotCheckOutRestore);

            // Verify MS-VERSS requirement: MS-VERSS_R185
            Site.CaptureRequirementIfIsTrue(
                isCurrentVersionIncreased,
                185,
                @"[In RestoreVersion] If the file is not checked out before the restoration, the current version number of the file MUST still be increased, as with any other change.");

            // Check out the file.
            bool isCheckOutFile = this.listsSutControlAdaterInstance.CheckoutFile(this.fileAbsoluteUrl);

            Site.Assert.IsTrue(
                isCheckOutFile,
                "CheckOutFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isCheckOutFile);

            // Call GetVersions operation using absolute fileName.
            getVersionsResponse = this.protocolAdapterInstance.GetVersions(this.fileAbsoluteUrl.AbsoluteUri);

            // Get current version before RestoreVersion operation in GetVersions response.
            currentVersionBeforeRestore = AdapterHelper.GetCurrentVersion(getVersionsResponse.results.result);

            // Get the previous version which is specific to be restored.
            restoreVersion = AdapterHelper.GetPreviousVersion(getVersionsResponse.results.result);

            // Call RestoreVersion operation using absolute fileName and restore a specified file to a specific version.
            RestoreVersionResponseRestoreVersionResult restoreVersionIsCheckOutResponse =
                this.protocolAdapterInstance.RestoreVersion(this.fileAbsoluteUrl.AbsoluteUri, restoreVersion);

            // Get the current version in RestoreVersion response.
            string currentVersionAfterIsCheckOutRestore = AdapterHelper.GetCurrentVersion(
                restoreVersionIsCheckOutResponse.results.result);

            // Add the debug information
            Site.Log.Add(
                LogEntryKind.Debug,
                "Verify MS-VERSS_R186, if the file is checked out, the current version before RestoreVersion is {0}," +
                " and after RestoreVersion is {1}",
                currentVersionBeforeRestore,
                currentVersionAfterIsCheckOutRestore);

            // Verify MS-VERSS requirement: MS-VERSS_R186
            Site.CaptureRequirementIfAreEqual <string>(
                currentVersionBeforeRestore,
                currentVersionAfterIsCheckOutRestore,
                186,
                @"[In RestoreVersion] If the file is checked out, the current version number of the file after restoration MUST remain the same as before restoration.");

            // Check in file.
            bool isCheckInFile = this.listsSutControlAdaterInstance.CheckInFile(
                this.fileAbsoluteUrl,
                TestSuiteHelper.FileComments,
                ((int)VersionType.MinorCheckIn).ToString());

            Site.Assert.IsTrue(
                isCheckInFile,
                "CheckInFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isCheckInFile);
        }
        /// <summary>
        /// A common method used to verify that the client uses the RestoreVersion operation to successfully restore
        /// the file specified by a URL to a specific version when check out is enforced.
        /// </summary>
        /// <param name="url">The URL of a file.</param>
        private void RestoreVersionVerification(string url)
        {
            // Enable the versioning of the list.
            bool setVersioning = this.sutControlAdapterInstance.SetVersioning(this.documentLibrary, true, true);

            Site.Assert.IsTrue(
                setVersioning,
                "SetVersioning operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                setVersioning);

            // Upload the file into specific list.
            bool isAddFileSuccessful = this.sutControlAdapterInstance.AddFile(this.documentLibrary, this.fileName, TestSuiteHelper.UploadFileName);

            Site.Assert.IsTrue(
                isAddFileSuccessful,
                "AddFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isAddFileSuccessful);

            // Check out and check in file one time to create a new version of the file.
            this.testSuiteHelper.AddOneFileVersion(this.fileName);

            // Enforce the file to be checked out.
            bool setServerEnforceCheckOut = this.sutControlAdapterInstance.SetEnforceCheckout(this.documentLibrary, true);

            Site.Assert.IsTrue(
                setServerEnforceCheckOut,
                "SetServerEnforceCheckOut operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                setServerEnforceCheckOut);

            // Call GetVersions operation using relative fileName.
            GetVersionsResponseGetVersionsResult getVersionsResponse = this.protocolAdapterInstance.GetVersions(
                url);

            // Verify the GetVersions results.
            this.testSuiteHelper.VerifyResultsInformation(getVersionsResponse.results, OperationName.GetVersions, true);

            // Check out the specified file.
            bool isCheckOutFile = this.listsSutControlAdaterInstance.CheckoutFile(this.fileAbsoluteUrl);

            Site.Assert.IsTrue(
                isCheckOutFile,
                "CheckOutFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isCheckOutFile);

            // Get the current version of the file.
            string currentVersionBeforeRestore = AdapterHelper.GetCurrentVersion(getVersionsResponse.results.result);

            // Get the previous version which is specific to be restored.
            string restoreVersion = AdapterHelper.GetPreviousVersion(getVersionsResponse.results.result);

            // Call RestoreVersion operation using relative fileName and restore a specified file to a specific version.
            RestoreVersionResponseRestoreVersionResult restoreVersionReponse = this.protocolAdapterInstance.RestoreVersion(
                url, restoreVersion);

            // Check in the specified file.
            bool isCheckInFile = this.listsSutControlAdaterInstance.CheckInFile(
                this.fileAbsoluteUrl,
                TestSuiteHelper.FileComments,
                ((int)VersionType.MinorCheckIn).ToString());

            Site.Assert.IsTrue(
                isCheckInFile,
                "CheckInFile operation returns {0}, TRUE means the operation was executed successfully," +
                " FALSE means the operation failed",
                isCheckInFile);

            // Verify the RestoreVersion results.
            this.testSuiteHelper.VerifyResultsInformation(restoreVersionReponse.results, OperationName.RestoreVersion, true);

            // Get the current version in RestoreVersion response.
            string currentVersionAfterRestore = AdapterHelper.GetCurrentVersion(restoreVersionReponse.results.result);

            // Verify whether the current version was increased by RestoreVersion.
            bool isCurrentVersionIncreased = AdapterHelper.IsCurrentVersionIncreased(
                currentVersionBeforeRestore,
                currentVersionAfterRestore);

            // Add the debug information
            Site.Log.Add(
                LogEntryKind.Debug,
                "Verify MS-VERSS_R182, the current version before RestoreVersion is {0}, and after RestoreVersion is {1}",
                currentVersionBeforeRestore,
                currentVersionAfterRestore);

            // Verify MS-VERSS requirement: MS-VERSS_R182
            Site.CaptureRequirementIfIsTrue(
                isCurrentVersionIncreased,
                182,
                @"[In RestoreVersion] After the restoration, the current version number of the file MUST still be increased, as with any other change.");
        }
        /// <summary>
        /// Verify the RestoreVersion operation related requirements.
        /// </summary>
        /// <param name="restoreVersionResult">The RestoreVersionResponseRestoreVersionResult object indicates
        /// RestoreVersion operation response.</param>
        /// <param name="soapBody">The string value indicates the SOAP body in RestoreVersion operation response.</param>
        private void VerifyRestoreVersion(RestoreVersionResponseRestoreVersionResult restoreVersionResult, string soapBody)
        {
            bool isSchemaVerified = SchemaValidation.ValidationResult.Equals(ValidationResult.Success);

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

            // Verify MS-VERSS requirement: MS-VERSS_R18701
            Site.CaptureRequirementIfIsTrue(
                isSchemaVerified,
                18701,
                @"[In RestoreVersion][The schema of GetVersions is defined as:] 
<wsdl:operation name=""RestoreVersion"">
    <wsdl:input message=""tns:RestoreVersionSoapIn"" />
    <wsdl:output message=""tns:RestoreVersionSoapOut"" />
</wsdl:operation>");
            #endregion

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

            // Verify MS-VERSS requirement: MS-VERSS_R141
            Site.CaptureRequirementIfIsNotNull(
                restoreVersionResult,
                141,
                @"[In RestoreVersion] [The protocol client sends a RestoreVersionSoapIn request message,] and the protocol server responds with a RestoreVersionSoapOut response message.");
            #endregion

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

            bool isR147Verified = AdapterHelper.IsExistElementInSoapBody(soapBody, "RestoreVersionResponse");

            // Verify MS-VERSS requirement: MS-VERSS_R147
            Site.CaptureRequirementIfIsTrue(
                isR147Verified,
                147,
                @"[In RestoreVersionSoapOut] The SOAP body contains a RestoreVersionResponse element.");
            #endregion

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

            // Verify MS-VERSS requirement: MS-VERSS_R151
            Site.CaptureRequirementIfIsTrue(
                isSchemaVerified,
                151,
                @"[In RestoreVersionResponse][The schema of RestoreVersionResponse element is defined as:]  
<s:element name=""RestoreVersionResponse"">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs=""1"" maxOccurs=""1"" name=""RestoreVersionResult"">
        <s:complexType>
          <s:sequence>
            <s:element name=""results"" minOccurs=""1"" maxOccurs=""1"" type=""tns:Results"" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
</s:element>");
            #endregion

            this.VerifyResultsComplexType(restoreVersionResult.results, isSchemaVerified);
        }