~~ Licensed to the Apache Software Foundation (ASF) under one or more
~~ contributor license agreements.  See the NOTICE file distributed with
~~ this work for additional information regarding copyright ownership.
~~ The ASF licenses this file to You 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.

Update the XQTS Results

  VXQuery stores the latest XQTS result for the last release.
  The file can be used to verify that all the previous test still passing.
  The following instructions show how to update the XQTS results file.

* Instructions

  * Verify current XQTS results are all passing before updating to the new XQTS test results.
  The XQTS should be located in "vxquery-xtest/test-suites/xqts", as explained in the {{{Running the Test Suite}http://vxquery.apache.org/user_running_tests.html}}
  The following command should produce all passing results.
  They can be viewed at {{{file:///tmp/previous_report.html}file:///tmp/previous_report.html}}.

----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/test-suites/xqts/XQTSCatalog.xml -htmlreport /tmp/previous_report.html -previous-test-results vxquery-xtest/results/xqts.txt
----------------------------------------

  * Remove the old results file.

----------------------------------------
rm vxquery-xtest/results/xqts.txt
----------------------------------------

  * Generate the new XQTS result file and save it in the text format.

----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/test-suites/xqts/XQTSCatalog.xml -textreport vxquery-xtest/results/xqts.txt
----------------------------------------
