<!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($) {
      $("#result").html("");
      $("#run").click(verify_install);
    });

    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);
    }

    function tests() {
      CouchDB.urlPrefix = "..";
      var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"});

      // cleanup, ignore the 404
      try {db.deleteDb();} catch(e) {};
      // create db
      db.createDb();

      // create document
      var doc = {a:1};
      var resp = db.save(doc);
      TEquals(true, resp.ok, "save document");
      // update document
      doc.b = 2;
      resp = db.save(doc);
      TEquals(true, resp.ok, "update document");
      TEquals(2, doc.b, "update document verified");
      // delete document
      resp = db.deleteDoc(doc);
      TEquals(true, resp.ok, "delete document");
      var doc2 = db.open(doc.id);
      TEquals(doc2, null, "delete document verified");

      // excercise query server
      db.save({a:1});
      db.save({a:2});
      db.save({a:3});

      //  temporary view
      var resp = db.query(function(doc) {
        if(doc.a) {
          emit(doc.a, doc.a);
        }
      });
      TEquals(3, resp.total_rows, "temp view query");

      // replication
      //   create second db
      var db2 = new CouchDB("test_suite_db2", {"X-Couch-Full-Commit":"false"});
      try {db2.deleteDb();} catch (e) {};
      db2.createDb();
      //   do replicate
      CouchDB.replicate("test_suite_db", "test_suite_db2");
      //   compare results
      TEquals(db.info().doc_count, db2.info().doc_count, "databases are equal");
    }

    function verify_install() {
      try {
        var result = $("#result");
        result.html("Running…");
        tests();
        result.html("Your installation looks fine. Time to Relax.");
      } catch(e) {
        console.log(e);
        result.html("X: " + e);
      }
    }
    </script>
  </head>
  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <strong>Verify Install</strong>
    </h1>
    <div id="content">
      <ul id="toolbar">
        <li><button class="run" id="run">Verify Your Installation.</button><span id="result"></span></li>
      </ul>
    </div>
  </div></body>
</html>
