<!DOCTYPE html>
<!--

Licensed 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.

-->
<html lang="en">
  <head>
    <title>Test Suite</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <link rel="stylesheet" href="style/layout.css?0.11.0" type="text/css">
    <script src="script/json2.js"></script>
    <script src="script/sha1.js"></script>
    <script src="script/jquery.js"></script>
    <script src="script/jquery.couch.js"></script>
    <script src="script/jquery.dialog.js"></script>
    <script src="script/futon.js"></script>
    <script src="script/couch.js"></script>
    <script src="script/couch_test_runner.js"></script>
    <script>
      $(function() {
        updateTestsListing();
        $("#toolbar button.run").click(function() {
          setupAdminParty(runAllTests) ;
        });
        $("#toolbar button.load").click(function() {
          location.reload(true);
        });
        $("#toolbar button.share").click(function() {
          $.showDialog("dialog/_share_test_reports.html", {
            submit: function(data, callback) {
              $.couch.replicate("test_suite_reports", "http://couchdb.couchdb.org/test_suite_reports");
              callback();
            }
          });
        });
        $("#toolbar button.add").click(function() {
          location = "custom_test.html";
        });
      });
      var testsPath = document.location.toString().split('?')[1];
      loadScript(testsPath||"script/couch_tests.js");
    </script>
  </head>
  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <strong>Test Suite</strong>
    </h1>
    <div id="content">
      <ul id="toolbar">
        <li><button class="run">Run All</button></li>
        <li><button class="load">Reload</button></li>
        <li><button class="share">Share Test Reports</button></li>
        <li><button class="add">Custom Test</button></li>
        <li class="current"></li>
      </ul>
      <p class="help">
        <strong>Note:</strong> Each of the tests will block the browser. If the
        connection to your CouchDB server is slow, running the tests will take
        some time, and you'll not be able to do much with your browser while
        a test is being executed. <strong>Also:</strong> The test suite is designed
        to work with Firefox (with Firebug disabled). Patches are welcome for 
        convenience compatibility with other browsers, but official support is
        for Firefox (latest stable version) only.
      </p>

      <table class="listing" id="tests" cellspacing="0">
        <caption>Tests</caption>
        <thead>
          <tr>
            <th class="name">Name</th>
            <th class="status">Status</th>
            <th class="duration">Elapsed Time</th>
            <th class="details">Details</th>
          </tr>
        </thead>
        <tbody class="content">
        </tbody>
        <tbody class="footer">
          <tr>
            <td colspan="4"></td>
          </tr>
        </tbody>
      </table>

    </div>
  </div></body>
</html>
