<!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>Custom Test</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <link rel="stylesheet" href="style/layout.css?0.9.0" type="text/css">
    <script src="script/json2.js"></script>
    <script src="script/jquery.js?1.3.1"></script>
    <script src="script/jquery.cookies.js?0.9.0"></script>
    <script src="script/jquery.couch.js?0.9.0"></script>
    <script src="script/jquery.resizer.js?0.9.0"></script>
    <script src="script/couch.js?0.9.0"></script>
    <script src="script/futon.js?0.9.0"></script>
    <script>
      function T(arg, desc) {
        if(!arg) {
          mesg = "Assertion failed" + (desc ? ": " + desc : "");
          throw new Error(mesg);
        }
      }

      function Tequals(expect, found, descr) {
        var mesg = "expected '" + expect + "', got '" + found + "' " + descr;
        T(expect === found, mesg);
      }

      $.futon.navigation.ready(function() {
        this.updateSelection(
          location.pathname.replace(/custom_test\.html/, "couch_tests.html"),
            "?script/couch_tests.js");
      });

      $(function() {
        $("#status").removeClass("failure").removeClass("success");
        $("#viewcode textarea").makeResizable({
          always: true,
          grippie: $("#viewcode .bottom"),
          vertical: true
        });
        $("#viewcode button.run").click(function() {
          $("#status").removeClass("failure").removeClass("success");
          var code = $("#code").val();
          try {
            var couchTests = {};
            var debug = false;
            code = eval(code);
            $.each(couchTests, function(elm) {
              couchTests[elm](debug);
            });
          } catch(e) {
            alert("" + e);
            $("#status").text("failure").addClass("failure");
            return false;
          }
          $("#status").text("success").addClass("success");
          return false;
        });
      });
    </script>
  </head>
  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <a class="dbname" href="couch_tests.html">Test Suite</a>
      <strong>Custom Test</strong>
    </h1>

    <div id="content">
      <div id="viewcode">
        <div class="top">
          <span>Test Function</span>
        </div>
        <table summary="Custom Test Function" cellspacing="0"><tr>
          <td class="code">
            <textarea name="code" id="code" rows="18" cols="120">
couchTests.custom_test = function(debug) {
  var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"});
  db.deleteDb();
  db.createDb();

  if (debug) debugger;

  alert("You can start writing your test now.");
};
</textarea>
          </td>
        </tr></table>
        <div class="bottom">
          <button class="run" type="button">Run</button>
          <span id="status">&nbsp;&nbsp;</span>
        </div>
      </div>
    </div>
  </div></body>
</html>
