<!--
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>
  <head>
    <link type="text/css" rel="stylesheet" href="../script/jspec/jspec.css" />
    <script src="../script/jquery.js"></script>
    <script src="../script/sha1.js"></script>
    <script src="../script/jspec/jspec.js"></script>
    <script src="../script/jspec/jspec.jquery.js"></script>
    <script src="../script/jspec/jspec.xhr.js"></script>
    <script src="./custom_helpers.js"></script>
    <script src="../script/couch.js"></script>
    <script src="../script/jquery.couch.js"></script>
    <script src="../script/couch_test_runner.js"></script>
    <script>
      function runSuites() {
        JSpec
        .exec('couch_js_class_methods_spec.js')
        .exec('couch_js_instance_methods_1_spec.js')
        .exec('couch_js_instance_methods_2_spec.js')
        .exec('couch_js_instance_methods_3_spec.js')
        .exec('jquery_couch_js_class_methods_spec.js')
        .exec('jquery_couch_js_instance_methods_1_spec.js')
        .exec('jquery_couch_js_instance_methods_2_spec.js')
        .exec('jquery_couch_js_instance_methods_3_spec.js')
        .run({failuresOnly: true})
        .report()
      }
    </script>
  </head>
  <body class="jspec" onLoad="runSuites();">
    <div id="jspec-top"><h2 id="jspec-title">JSpec <em><script>document.write(JSpec.version)</script></em></h2></div>
    <div id="jspec"></div>
    <div id="jspec-bottom"></div>
  </body>
</html>
