<!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?1.4.2"></script>
    <script src="script/jquery.couch.js?0.11.0"></script>
    <script src="script/jquery.dialog.js?0.11.0"></script>
    <script src="script/futon.js?0.11.0"></script>
    <script src="script/couch.js?0.11.0"></script>
    <script src="script/couch_test_runner.js?0.11.0"></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.
      </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>
