<!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.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/jquery.resizer.js"></script>
    <script src="script/couch.js"></script>
    <script src="script/couch_test_runner.js"></script>
    <script src="script/couch_tests.js"></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").enableTabInsertion().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>
