You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2008/11/17 23:14:14 UTC

svn commit: r718409 - in /incubator/couchdb/trunk/share/www: couch_tests.html index.html script/browse.js script/couch_test_runner.js script/couch_tests.js

Author: jchris
Date: Mon Nov 17 14:14:14 2008
New Revision: 718409

URL: http://svn.apache.org/viewvc?rev=718409&view=rev
Log:
factored couch_test_runner.js out from couch_tests.js, made it usuable for unit testing views from design docs

Added:
    incubator/couchdb/trunk/share/www/script/couch_test_runner.js   (with props)
Modified:
    incubator/couchdb/trunk/share/www/couch_tests.html
    incubator/couchdb/trunk/share/www/index.html
    incubator/couchdb/trunk/share/www/script/browse.js
    incubator/couchdb/trunk/share/www/script/couch_tests.js

Modified: incubator/couchdb/trunk/share/www/couch_tests.html
URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/couch_tests.html?rev=718409&r1=718408&r2=718409&view=diff
==============================================================================
--- incubator/couchdb/trunk/share/www/couch_tests.html [utf-8] (original)
+++ incubator/couchdb/trunk/share/www/couch_tests.html [utf-8] Mon Nov 17 14:14:14 2008
@@ -22,20 +22,18 @@
     <script src="script/jquery.js?1.2.6"></script>
     <script src="script/couch.js?0.8.0"></script>
     <script src="script/pprint.js?0.8.0"></script>
+    <script src="script/couch_test_runner.js"></script>
     <script>
-      $(document).ready(function() {
+      $(function() {        
+        updateTestsListing();
+        $("#toolbar button.run").click(runAllTests);
+        if (window != parent) parent.updateNavigation();        
         $("#toolbar button.load").click(function() {
           location.reload(true);
         });
       });
-    </script>
-    <script src="script/couch_tests.js"></script>
-    <script>
-      $(document).ready(function() {
-        updateTestsListing();
-        $("#toolbar button.run").click(runAllTests);
-        if (window != parent) parent.updateNavigation();
-      });
+      var testsPath = document.location.toString().split('?')[1];
+      loadTests(testsPath||"script/couch_tests.js")
     </script>
   </head>
   <body>

Modified: incubator/couchdb/trunk/share/www/index.html
URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/index.html?rev=718409&r1=718408&r2=718409&view=diff
==============================================================================
--- incubator/couchdb/trunk/share/www/index.html [utf-8] (original)
+++ incubator/couchdb/trunk/share/www/index.html [utf-8] Mon Nov 17 14:14:14 2008
@@ -87,7 +87,7 @@
         <li><a href="browse/index.html" target="content">Overview</a></li>
         <li><a href="replicator.html" target="content">Replicator</a></li>
         <li><a href="config.html" target="content">Configuration</a></li>
-        <li><a href="couch_tests.html" target="content">Test Suite</a></li>
+        <li><a href="couch_tests.html?script/couch_tests.js" target="content">Test Suite</a></li>
       </ul></li>
       <li><span>Recent Databases</span>
         <ul id="dbs"></ul>

Modified: incubator/couchdb/trunk/share/www/script/browse.js
URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/browse.js?rev=718409&r1=718408&r2=718409&view=diff
==============================================================================
--- incubator/couchdb/trunk/share/www/script/browse.js [utf-8] (original)
+++ incubator/couchdb/trunk/share/www/script/browse.js [utf-8] Mon Nov 17 14:14:14 2008
@@ -873,12 +873,18 @@
   }
 
   function _renderAttachmentItem(name, attachment) {
+    var attachmentHref = db.uri + encodeURIComponent(docId) 
+      + "/" + encodeURIComponent(name);
     var li = $("<li></li>");
     $("<a href='' title='Download file' target='_top'></a>").text(name)
-      .attr("href", db.uri + encodeURIComponent(docId) + "/" + encodeURIComponent(name))
+      .attr("href", attachmentHref)
       .wrapInner("<tt></tt>").appendTo(li);
     $("<span>()</span>").text("" + prettyPrintSize(attachment.length) + 
       ", " + attachment.content_type).addClass("info").appendTo(li);
+    if (name == "tests.js") {
+      li.find('span.info').append(', <a href="/_utils/couch_tests.html?' 
+        + attachmentHref + '">open in test runner</a>');
+    }
     _initAttachmentItem(name, attachment, li);
     return li;
   }

Added: incubator/couchdb/trunk/share/www/script/couch_test_runner.js
URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/couch_test_runner.js?rev=718409&view=auto
==============================================================================
--- incubator/couchdb/trunk/share/www/script/couch_test_runner.js (added)
+++ incubator/couchdb/trunk/share/www/script/couch_test_runner.js Mon Nov 17 14:14:14 2008
@@ -0,0 +1,181 @@
+// 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.
+
+// *********************** Test Framework of Sorts ************************* //
+
+function loadTests(url) {  
+  document.write('<script src="'+url+'"></script>');
+};
+
+function patchTest(fun) {
+  var source = fun.toString();
+  var output = "";
+  var i = 0;
+  var testMarker = "T("
+  while (i < source.length) {
+    var testStart = source.indexOf(testMarker, i);
+    if (testStart == -1) {
+      output = output + source.substring(i, source.length);
+      break;
+    }
+    var testEnd = source.indexOf(");", testStart);
+    var testCode = source.substring(testStart + testMarker.length, testEnd);
+    output += source.substring(i, testStart) + "T(" + testCode + "," + JSON.stringify(testCode);
+    i = testEnd;
+  }
+  try {
+    return eval("(" + output + ")");
+  } catch (e) {
+    return null;
+  }
+}
+
+function runAllTests() {
+  var rows = $("#tests tbody.content tr");
+  $("td", rows).html("&nbsp;");
+  $("td.status", rows).removeClass("error").removeClass("failure").removeClass("success").text("not run");
+  var offset = 0;
+  function runNext() {
+    if (offset < rows.length) {
+      var row = rows.get(offset);
+      runTest($("th button", row).get(0), function() {
+        offset += 1;
+        setTimeout(runNext, 1000);
+      });
+    }
+  }
+  runNext();
+}
+
+var numFailures = 0;
+var currentRow = null;
+
+function runTest(button, callback, debug) {
+  if (currentRow != null) {
+    alert("Can not run multiple tests simultaneously.");
+    return;
+  }
+  var row = currentRow = $(button).parents("tr").get(0);
+  $("td.status", row).removeClass("error").removeClass("failure").removeClass("success");
+  $("td", row).html("&nbsp;");
+  var testFun = tests[row.id];
+  function run() {
+    numFailures = 0;
+    var start = new Date().getTime();
+    try {
+      if (debug == undefined || !debug) {
+        testFun = patchTest(testFun) || testFun;
+      }
+      testFun(debug);
+      var status = numFailures > 0 ? "failure" : "success";
+    } catch (e) {
+      var status = "error";
+      if ($("td.details ol", row).length == 0) {
+        $("<ol></ol>").appendTo($("td.details", row));
+      }
+      $("<li><b>Exception raised:</b> <code class='error'></code></li>")
+        .find("code").text(JSON.stringify(e)).end()
+        .appendTo($("td.details ol", row));
+      if (debug) {
+        currentRow = null;
+        throw e;
+      }
+    }
+    if ($("td.details ol", row).length) {
+      $("<a href='#'>Run with debugger</a>").click(function() {
+        runTest(this, undefined, true);
+      }).prependTo($("td.details ol", row));
+    }
+    var duration = new Date().getTime() - start;
+    $("td.status", row).removeClass("running").addClass(status).text(status);
+    $("td.duration", row).text(duration + "ms");
+    updateTestsFooter();
+    currentRow = null;
+    if (callback) callback();
+  }
+  $("td.status", row).addClass("running").text("running…");
+  setTimeout(run, 100);
+}
+
+function showSource(cell) {
+  var name = $(cell).text();
+  var win = window.open("", name, "width=700,height=500,resizable=yes,scrollbars=yes");
+  win.document.title = name;
+  $("<pre></pre>").text(tests[name].toString()).appendTo(win.document.body).fadeIn();
+}
+
+function updateTestsListing() {
+  for (var name in tests) {
+    if (!tests.hasOwnProperty(name)) continue;
+    var testFunction = tests[name];
+    var row = $("<tr><th></th><td></td><td></td><td></td></tr>")
+      .find("th").text(name).attr("title", "Show source").click(function() {
+        showSource(this);
+      }).end()
+      .find("td:nth(0)").addClass("status").text("not run").end()
+      .find("td:nth(1)").addClass("duration").html("&nbsp;").end()
+      .find("td:nth(2)").addClass("details").html("&nbsp;").end();
+    $("<button type='button' class='run' title='Run test'></button>").click(function() {
+      this.blur();
+      runTest(this);
+      return false;
+    }).prependTo(row.find("th"));
+    row.attr("id", name).appendTo("#tests tbody.content");
+  }
+  $("#tests tr").removeClass("odd").filter(":odd").addClass("odd");
+  updateTestsFooter();
+}
+
+function updateTestsFooter() {
+  var tests = $("#tests tbody.content tr td.status");
+  var testsRun = tests.not(":contains('not run'))");
+  var testsFailed = testsRun.not(".success");
+  $("#tests tbody.footer td").text(testsRun.length + " of " + tests.length +
+    " test(s) run, " + testsFailed.length + " failures");
+}
+
+// Use T to perform a test that returns false on failure and if the test fails,
+// display the line that failed.
+// Example:
+// T(MyValue==1);
+function T(arg1, arg2) {
+  if (!arg1) {
+    if (currentRow) {
+      if ($("td.details ol", currentRow).length == 0) {
+        $("<ol></ol>").appendTo($("td.details", currentRow));
+      }
+      $("<li><b>Assertion failed:</b> <code class='failure'></code></li>")
+        .find("code").text((arg2 != null ? arg2 : arg1).toString()).end()
+        .appendTo($("td.details ol", currentRow));
+    }
+    numFailures += 1
+  }
+}
+
+function equals(a,b) {
+  if (a === b) return true;
+  try {
+    return repr(a) === repr(b);
+  } catch (e) {
+    return false;
+  }
+}
+
+function repr(val) {
+  if (val === undefined) {
+    return null;
+  } else if (val === null) {
+    return "null";
+  } else {
+    return JSON.stringify(val);
+  }
+}
\ No newline at end of file

Propchange: incubator/couchdb/trunk/share/www/script/couch_test_runner.js
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/couchdb/trunk/share/www/script/couch_tests.js
URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/couch_tests.js?rev=718409&r1=718408&r2=718409&view=diff
==============================================================================
--- incubator/couchdb/trunk/share/www/script/couch_tests.js [utf-8] (original)
+++ incubator/couchdb/trunk/share/www/script/couch_tests.js [utf-8] Mon Nov 17 14:14:14 2008
@@ -2067,172 +2067,6 @@
   return docs;
 }
 
-// *********************** Test Framework of Sorts ************************* //
-
-function patchTest(fun) {
-  var source = fun.toString();
-  var output = "";
-  var i = 0;
-  var testMarker = "T("
-  while (i < source.length) {
-    var testStart = source.indexOf(testMarker, i);
-    if (testStart == -1) {
-      output = output + source.substring(i, source.length);
-      break;
-    }
-    var testEnd = source.indexOf(");", testStart);
-    var testCode = source.substring(testStart + testMarker.length, testEnd);
-    output += source.substring(i, testStart) + "T(" + testCode + "," + JSON.stringify(testCode);
-    i = testEnd;
-  }
-  try {
-    return eval("(" + output + ")");
-  } catch (e) {
-    return null;
-  }
-}
-
-function runAllTests() {
-  var rows = $("#tests tbody.content tr");
-  $("td", rows).html("&nbsp;");
-  $("td.status", rows).removeClass("error").removeClass("failure").removeClass("success").text("not run");
-  var offset = 0;
-  function runNext() {
-    if (offset < rows.length) {
-      var row = rows.get(offset);
-      runTest($("th button", row).get(0), function() {
-        offset += 1;
-        setTimeout(runNext, 1000);
-      });
-    }
-  }
-  runNext();
-}
-
-var numFailures = 0;
-var currentRow = null;
-
-function runTest(button, callback, debug) {
-  if (currentRow != null) {
-    alert("Can not run multiple tests simultaneously.");
-    return;
-  }
-  var row = currentRow = $(button).parents("tr").get(0);
-  $("td.status", row).removeClass("error").removeClass("failure").removeClass("success");
-  $("td", row).html("&nbsp;");
-  var testFun = tests[row.id];
-  function run() {
-    numFailures = 0;
-    var start = new Date().getTime();
-    try {
-      if (debug == undefined || !debug) {
-        testFun = patchTest(testFun) || testFun;
-      }
-      testFun(debug);
-      var status = numFailures > 0 ? "failure" : "success";
-    } catch (e) {
-      var status = "error";
-      if ($("td.details ol", row).length == 0) {
-        $("<ol></ol>").appendTo($("td.details", row));
-      }
-      $("<li><b>Exception raised:</b> <code class='error'></code></li>")
-        .find("code").text(JSON.stringify(e)).end()
-        .appendTo($("td.details ol", row));
-      if (debug) {
-        currentRow = null;
-        throw e;
-      }
-    }
-    if ($("td.details ol", row).length) {
-      $("<a href='#'>Run with debugger</a>").click(function() {
-        runTest(this, undefined, true);
-      }).prependTo($("td.details ol", row));
-    }
-    var duration = new Date().getTime() - start;
-    $("td.status", row).removeClass("running").addClass(status).text(status);
-    $("td.duration", row).text(duration + "ms");
-    updateTestsFooter();
-    currentRow = null;
-    if (callback) callback();
-  }
-  $("td.status", row).addClass("running").text("running…");
-  setTimeout(run, 100);
-}
-
-function showSource(cell) {
-  var name = $(cell).text();
-  var win = window.open("", name, "width=700,height=500,resizable=yes,scrollbars=yes");
-  win.document.title = name;
-  $("<pre></pre>").text(tests[name].toString()).appendTo(win.document.body).fadeIn();
-}
-
-function updateTestsListing() {
-  for (var name in tests) {
-    if (!tests.hasOwnProperty(name)) continue;
-    var testFunction = tests[name];
-    var row = $("<tr><th></th><td></td><td></td><td></td></tr>")
-      .find("th").text(name).attr("title", "Show source").click(function() {
-        showSource(this);
-      }).end()
-      .find("td:nth(0)").addClass("status").text("not run").end()
-      .find("td:nth(1)").addClass("duration").html("&nbsp;").end()
-      .find("td:nth(2)").addClass("details").html("&nbsp;").end();
-    $("<button type='button' class='run' title='Run test'></button>").click(function() {
-      this.blur();
-      runTest(this);
-      return false;
-    }).prependTo(row.find("th"));
-    row.attr("id", name).appendTo("#tests tbody.content");
-  }
-  $("#tests tr").removeClass("odd").filter(":odd").addClass("odd");
-  updateTestsFooter();
-}
-
-function updateTestsFooter() {
-  var tests = $("#tests tbody.content tr td.status");
-  var testsRun = tests.not(":contains('not run'))");
-  var testsFailed = testsRun.not(".success");
-  $("#tests tbody.footer td").text(testsRun.length + " of " + tests.length +
-    " test(s) run, " + testsFailed.length + " failures");
-}
-
-// Use T to perform a test that returns false on failure and if the test fails,
-// display the line that failed.
-// Example:
-// T(MyValue==1);
-function T(arg1, arg2) {
-  if (!arg1) {
-    if (currentRow) {
-      if ($("td.details ol", currentRow).length == 0) {
-        $("<ol></ol>").appendTo($("td.details", currentRow));
-      }
-      $("<li><b>Assertion failed:</b> <code class='failure'></code></li>")
-        .find("code").text((arg2 != null ? arg2 : arg1).toString()).end()
-        .appendTo($("td.details ol", currentRow));
-    }
-    numFailures += 1
-  }
-}
-
-function equals(a,b) {
-  if (a === b) return true;
-  try {
-    return repr(a) === repr(b);
-  } catch (e) {
-    return false;
-  }
-}
-
-function repr(val) {
-  if (val === undefined) {
-    return null;
-  } else if (val === null) {
-    return "null";
-  } else {
-    return JSON.stringify(val);
-  }
-}
-
 function restartServer() {
   var reply = CouchDB.request("POST", "/_restart");
   do {



Re: svn commit: r718409 - in /incubator/couchdb/trunk/share/www: couch_tests.html index.html script/browse.js script/couch_test_runner.js script/couch_tests.js

Posted by Chris Anderson <jc...@apache.org>.
This is something I came up with testing some views on the plane down
to San Jose today. The feature is twofold:

A) /_utils/couch_tests.html now takes an optional query string, which
tells it an extra JavaScript file to load. The default (CouchDB's
functional tests, can be accessed via
http://localhost:5984/_utils/couch_tests.html?script/couch_tests.js
but the reason I added it is that you can use path like
/_utils/couch_tests.html?/twitter-client/_design%2Ftwitter-client/tests.js
to load an attachment as the source of the tests variable. I haven't
run svn up on my public CouchDB instance, or I'd link to a running
setup. This is what my couchdb-twitter-client view tests look like:
http://github.com/jchris/couchdb-twitter-client/tree/master/_attachments/tests.js

B) When browsing a document in Futon that has an attachment called
tests.js, a link is provided for running the tests using the Futon
test runner. Here's what it looks like:
http://img.skitch.com/20081117-q4s5ypatrtqk8a4tpmki59249c.png

Hope y'all like this. Please suggest (and patch) improvements!

Chris

On Mon, Nov 17, 2008 at 2:14 PM,  <jc...@apache.org> wrote:
> Author: jchris
> Date: Mon Nov 17 14:14:14 2008
> New Revision: 718409
>
> URL: http://svn.apache.org/viewvc?rev=718409&view=rev
> Log:
> factored couch_test_runner.js out from couch_tests.js, made it usuable for unit testing views from design docs
>
> Added:
>    incubator/couchdb/trunk/share/www/script/couch_test_runner.js   (with props)
> Modified:
>    incubator/couchdb/trunk/share/www/couch_tests.html
>    incubator/couchdb/trunk/share/www/index.html
>    incubator/couchdb/trunk/share/www/script/browse.js
>    incubator/couchdb/trunk/share/www/script/couch_tests.js
>
> Modified: incubator/couchdb/trunk/share/www/couch_tests.html
> URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/couch_tests.html?rev=718409&r1=718408&r2=718409&view=diff
> ==============================================================================
> --- incubator/couchdb/trunk/share/www/couch_tests.html [utf-8] (original)
> +++ incubator/couchdb/trunk/share/www/couch_tests.html [utf-8] Mon Nov 17 14:14:14 2008
> @@ -22,20 +22,18 @@
>     <script src="script/jquery.js?1.2.6"></script>
>     <script src="script/couch.js?0.8.0"></script>
>     <script src="script/pprint.js?0.8.0"></script>
> +    <script src="script/couch_test_runner.js"></script>
>     <script>
> -      $(document).ready(function() {
> +      $(function() {
> +        updateTestsListing();
> +        $("#toolbar button.run").click(runAllTests);
> +        if (window != parent) parent.updateNavigation();
>         $("#toolbar button.load").click(function() {
>           location.reload(true);
>         });
>       });
> -    </script>
> -    <script src="script/couch_tests.js"></script>
> -    <script>
> -      $(document).ready(function() {
> -        updateTestsListing();
> -        $("#toolbar button.run").click(runAllTests);
> -        if (window != parent) parent.updateNavigation();
> -      });
> +      var testsPath = document.location.toString().split('?')[1];
> +      loadTests(testsPath||"script/couch_tests.js")
>     </script>
>   </head>
>   <body>
>
> Modified: incubator/couchdb/trunk/share/www/index.html
> URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/index.html?rev=718409&r1=718408&r2=718409&view=diff
> ==============================================================================
> --- incubator/couchdb/trunk/share/www/index.html [utf-8] (original)
> +++ incubator/couchdb/trunk/share/www/index.html [utf-8] Mon Nov 17 14:14:14 2008
> @@ -87,7 +87,7 @@
>         <li><a href="browse/index.html" target="content">Overview</a></li>
>         <li><a href="replicator.html" target="content">Replicator</a></li>
>         <li><a href="config.html" target="content">Configuration</a></li>
> -        <li><a href="couch_tests.html" target="content">Test Suite</a></li>
> +        <li><a href="couch_tests.html?script/couch_tests.js" target="content">Test Suite</a></li>
>       </ul></li>
>       <li><span>Recent Databases</span>
>         <ul id="dbs"></ul>
>
> Modified: incubator/couchdb/trunk/share/www/script/browse.js
> URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/browse.js?rev=718409&r1=718408&r2=718409&view=diff
> ==============================================================================
> --- incubator/couchdb/trunk/share/www/script/browse.js [utf-8] (original)
> +++ incubator/couchdb/trunk/share/www/script/browse.js [utf-8] Mon Nov 17 14:14:14 2008
> @@ -873,12 +873,18 @@
>   }
>
>   function _renderAttachmentItem(name, attachment) {
> +    var attachmentHref = db.uri + encodeURIComponent(docId)
> +      + "/" + encodeURIComponent(name);
>     var li = $("<li></li>");
>     $("<a href='' title='Download file' target='_top'></a>").text(name)
> -      .attr("href", db.uri + encodeURIComponent(docId) + "/" + encodeURIComponent(name))
> +      .attr("href", attachmentHref)
>       .wrapInner("<tt></tt>").appendTo(li);
>     $("<span>()</span>").text("" + prettyPrintSize(attachment.length) +
>       ", " + attachment.content_type).addClass("info").appendTo(li);
> +    if (name == "tests.js") {
> +      li.find('span.info').append(', <a href="/_utils/couch_tests.html?'
> +        + attachmentHref + '">open in test runner</a>');
> +    }
>     _initAttachmentItem(name, attachment, li);
>     return li;
>   }
>
> Added: incubator/couchdb/trunk/share/www/script/couch_test_runner.js
> URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/couch_test_runner.js?rev=718409&view=auto
> ==============================================================================
> --- incubator/couchdb/trunk/share/www/script/couch_test_runner.js (added)
> +++ incubator/couchdb/trunk/share/www/script/couch_test_runner.js Mon Nov 17 14:14:14 2008
> @@ -0,0 +1,181 @@
> +// 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.
> +
> +// *********************** Test Framework of Sorts ************************* //
> +
> +function loadTests(url) {
> +  document.write('<script src="'+url+'"></script>');
> +};
> +
> +function patchTest(fun) {
> +  var source = fun.toString();
> +  var output = "";
> +  var i = 0;
> +  var testMarker = "T("
> +  while (i < source.length) {
> +    var testStart = source.indexOf(testMarker, i);
> +    if (testStart == -1) {
> +      output = output + source.substring(i, source.length);
> +      break;
> +    }
> +    var testEnd = source.indexOf(");", testStart);
> +    var testCode = source.substring(testStart + testMarker.length, testEnd);
> +    output += source.substring(i, testStart) + "T(" + testCode + "," + JSON.stringify(testCode);
> +    i = testEnd;
> +  }
> +  try {
> +    return eval("(" + output + ")");
> +  } catch (e) {
> +    return null;
> +  }
> +}
> +
> +function runAllTests() {
> +  var rows = $("#tests tbody.content tr");
> +  $("td", rows).html("&nbsp;");
> +  $("td.status", rows).removeClass("error").removeClass("failure").removeClass("success").text("not run");
> +  var offset = 0;
> +  function runNext() {
> +    if (offset < rows.length) {
> +      var row = rows.get(offset);
> +      runTest($("th button", row).get(0), function() {
> +        offset += 1;
> +        setTimeout(runNext, 1000);
> +      });
> +    }
> +  }
> +  runNext();
> +}
> +
> +var numFailures = 0;
> +var currentRow = null;
> +
> +function runTest(button, callback, debug) {
> +  if (currentRow != null) {
> +    alert("Can not run multiple tests simultaneously.");
> +    return;
> +  }
> +  var row = currentRow = $(button).parents("tr").get(0);
> +  $("td.status", row).removeClass("error").removeClass("failure").removeClass("success");
> +  $("td", row).html("&nbsp;");
> +  var testFun = tests[row.id];
> +  function run() {
> +    numFailures = 0;
> +    var start = new Date().getTime();
> +    try {
> +      if (debug == undefined || !debug) {
> +        testFun = patchTest(testFun) || testFun;
> +      }
> +      testFun(debug);
> +      var status = numFailures > 0 ? "failure" : "success";
> +    } catch (e) {
> +      var status = "error";
> +      if ($("td.details ol", row).length == 0) {
> +        $("<ol></ol>").appendTo($("td.details", row));
> +      }
> +      $("<li><b>Exception raised:</b> <code class='error'></code></li>")
> +        .find("code").text(JSON.stringify(e)).end()
> +        .appendTo($("td.details ol", row));
> +      if (debug) {
> +        currentRow = null;
> +        throw e;
> +      }
> +    }
> +    if ($("td.details ol", row).length) {
> +      $("<a href='#'>Run with debugger</a>").click(function() {
> +        runTest(this, undefined, true);
> +      }).prependTo($("td.details ol", row));
> +    }
> +    var duration = new Date().getTime() - start;
> +    $("td.status", row).removeClass("running").addClass(status).text(status);
> +    $("td.duration", row).text(duration + "ms");
> +    updateTestsFooter();
> +    currentRow = null;
> +    if (callback) callback();
> +  }
> +  $("td.status", row).addClass("running").text("running…");
> +  setTimeout(run, 100);
> +}
> +
> +function showSource(cell) {
> +  var name = $(cell).text();
> +  var win = window.open("", name, "width=700,height=500,resizable=yes,scrollbars=yes");
> +  win.document.title = name;
> +  $("<pre></pre>").text(tests[name].toString()).appendTo(win.document.body).fadeIn();
> +}
> +
> +function updateTestsListing() {
> +  for (var name in tests) {
> +    if (!tests.hasOwnProperty(name)) continue;
> +    var testFunction = tests[name];
> +    var row = $("<tr><th></th><td></td><td></td><td></td></tr>")
> +      .find("th").text(name).attr("title", "Show source").click(function() {
> +        showSource(this);
> +      }).end()
> +      .find("td:nth(0)").addClass("status").text("not run").end()
> +      .find("td:nth(1)").addClass("duration").html("&nbsp;").end()
> +      .find("td:nth(2)").addClass("details").html("&nbsp;").end();
> +    $("<button type='button' class='run' title='Run test'></button>").click(function() {
> +      this.blur();
> +      runTest(this);
> +      return false;
> +    }).prependTo(row.find("th"));
> +    row.attr("id", name).appendTo("#tests tbody.content");
> +  }
> +  $("#tests tr").removeClass("odd").filter(":odd").addClass("odd");
> +  updateTestsFooter();
> +}
> +
> +function updateTestsFooter() {
> +  var tests = $("#tests tbody.content tr td.status");
> +  var testsRun = tests.not(":contains('not run'))");
> +  var testsFailed = testsRun.not(".success");
> +  $("#tests tbody.footer td").text(testsRun.length + " of " + tests.length +
> +    " test(s) run, " + testsFailed.length + " failures");
> +}
> +
> +// Use T to perform a test that returns false on failure and if the test fails,
> +// display the line that failed.
> +// Example:
> +// T(MyValue==1);
> +function T(arg1, arg2) {
> +  if (!arg1) {
> +    if (currentRow) {
> +      if ($("td.details ol", currentRow).length == 0) {
> +        $("<ol></ol>").appendTo($("td.details", currentRow));
> +      }
> +      $("<li><b>Assertion failed:</b> <code class='failure'></code></li>")
> +        .find("code").text((arg2 != null ? arg2 : arg1).toString()).end()
> +        .appendTo($("td.details ol", currentRow));
> +    }
> +    numFailures += 1
> +  }
> +}
> +
> +function equals(a,b) {
> +  if (a === b) return true;
> +  try {
> +    return repr(a) === repr(b);
> +  } catch (e) {
> +    return false;
> +  }
> +}
> +
> +function repr(val) {
> +  if (val === undefined) {
> +    return null;
> +  } else if (val === null) {
> +    return "null";
> +  } else {
> +    return JSON.stringify(val);
> +  }
> +}
> \ No newline at end of file
>
> Propchange: incubator/couchdb/trunk/share/www/script/couch_test_runner.js
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Modified: incubator/couchdb/trunk/share/www/script/couch_tests.js
> URL: http://svn.apache.org/viewvc/incubator/couchdb/trunk/share/www/script/couch_tests.js?rev=718409&r1=718408&r2=718409&view=diff
> ==============================================================================
> --- incubator/couchdb/trunk/share/www/script/couch_tests.js [utf-8] (original)
> +++ incubator/couchdb/trunk/share/www/script/couch_tests.js [utf-8] Mon Nov 17 14:14:14 2008
> @@ -2067,172 +2067,6 @@
>   return docs;
>  }
>
> -// *********************** Test Framework of Sorts ************************* //
> -
> -function patchTest(fun) {
> -  var source = fun.toString();
> -  var output = "";
> -  var i = 0;
> -  var testMarker = "T("
> -  while (i < source.length) {
> -    var testStart = source.indexOf(testMarker, i);
> -    if (testStart == -1) {
> -      output = output + source.substring(i, source.length);
> -      break;
> -    }
> -    var testEnd = source.indexOf(");", testStart);
> -    var testCode = source.substring(testStart + testMarker.length, testEnd);
> -    output += source.substring(i, testStart) + "T(" + testCode + "," + JSON.stringify(testCode);
> -    i = testEnd;
> -  }
> -  try {
> -    return eval("(" + output + ")");
> -  } catch (e) {
> -    return null;
> -  }
> -}
> -
> -function runAllTests() {
> -  var rows = $("#tests tbody.content tr");
> -  $("td", rows).html("&nbsp;");
> -  $("td.status", rows).removeClass("error").removeClass("failure").removeClass("success").text("not run");
> -  var offset = 0;
> -  function runNext() {
> -    if (offset < rows.length) {
> -      var row = rows.get(offset);
> -      runTest($("th button", row).get(0), function() {
> -        offset += 1;
> -        setTimeout(runNext, 1000);
> -      });
> -    }
> -  }
> -  runNext();
> -}
> -
> -var numFailures = 0;
> -var currentRow = null;
> -
> -function runTest(button, callback, debug) {
> -  if (currentRow != null) {
> -    alert("Can not run multiple tests simultaneously.");
> -    return;
> -  }
> -  var row = currentRow = $(button).parents("tr").get(0);
> -  $("td.status", row).removeClass("error").removeClass("failure").removeClass("success");
> -  $("td", row).html("&nbsp;");
> -  var testFun = tests[row.id];
> -  function run() {
> -    numFailures = 0;
> -    var start = new Date().getTime();
> -    try {
> -      if (debug == undefined || !debug) {
> -        testFun = patchTest(testFun) || testFun;
> -      }
> -      testFun(debug);
> -      var status = numFailures > 0 ? "failure" : "success";
> -    } catch (e) {
> -      var status = "error";
> -      if ($("td.details ol", row).length == 0) {
> -        $("<ol></ol>").appendTo($("td.details", row));
> -      }
> -      $("<li><b>Exception raised:</b> <code class='error'></code></li>")
> -        .find("code").text(JSON.stringify(e)).end()
> -        .appendTo($("td.details ol", row));
> -      if (debug) {
> -        currentRow = null;
> -        throw e;
> -      }
> -    }
> -    if ($("td.details ol", row).length) {
> -      $("<a href='#'>Run with debugger</a>").click(function() {
> -        runTest(this, undefined, true);
> -      }).prependTo($("td.details ol", row));
> -    }
> -    var duration = new Date().getTime() - start;
> -    $("td.status", row).removeClass("running").addClass(status).text(status);
> -    $("td.duration", row).text(duration + "ms");
> -    updateTestsFooter();
> -    currentRow = null;
> -    if (callback) callback();
> -  }
> -  $("td.status", row).addClass("running").text("running…");
> -  setTimeout(run, 100);
> -}
> -
> -function showSource(cell) {
> -  var name = $(cell).text();
> -  var win = window.open("", name, "width=700,height=500,resizable=yes,scrollbars=yes");
> -  win.document.title = name;
> -  $("<pre></pre>").text(tests[name].toString()).appendTo(win.document.body).fadeIn();
> -}
> -
> -function updateTestsListing() {
> -  for (var name in tests) {
> -    if (!tests.hasOwnProperty(name)) continue;
> -    var testFunction = tests[name];
> -    var row = $("<tr><th></th><td></td><td></td><td></td></tr>")
> -      .find("th").text(name).attr("title", "Show source").click(function() {
> -        showSource(this);
> -      }).end()
> -      .find("td:nth(0)").addClass("status").text("not run").end()
> -      .find("td:nth(1)").addClass("duration").html("&nbsp;").end()
> -      .find("td:nth(2)").addClass("details").html("&nbsp;").end();
> -    $("<button type='button' class='run' title='Run test'></button>").click(function() {
> -      this.blur();
> -      runTest(this);
> -      return false;
> -    }).prependTo(row.find("th"));
> -    row.attr("id", name).appendTo("#tests tbody.content");
> -  }
> -  $("#tests tr").removeClass("odd").filter(":odd").addClass("odd");
> -  updateTestsFooter();
> -}
> -
> -function updateTestsFooter() {
> -  var tests = $("#tests tbody.content tr td.status");
> -  var testsRun = tests.not(":contains('not run'))");
> -  var testsFailed = testsRun.not(".success");
> -  $("#tests tbody.footer td").text(testsRun.length + " of " + tests.length +
> -    " test(s) run, " + testsFailed.length + " failures");
> -}
> -
> -// Use T to perform a test that returns false on failure and if the test fails,
> -// display the line that failed.
> -// Example:
> -// T(MyValue==1);
> -function T(arg1, arg2) {
> -  if (!arg1) {
> -    if (currentRow) {
> -      if ($("td.details ol", currentRow).length == 0) {
> -        $("<ol></ol>").appendTo($("td.details", currentRow));
> -      }
> -      $("<li><b>Assertion failed:</b> <code class='failure'></code></li>")
> -        .find("code").text((arg2 != null ? arg2 : arg1).toString()).end()
> -        .appendTo($("td.details ol", currentRow));
> -    }
> -    numFailures += 1
> -  }
> -}
> -
> -function equals(a,b) {
> -  if (a === b) return true;
> -  try {
> -    return repr(a) === repr(b);
> -  } catch (e) {
> -    return false;
> -  }
> -}
> -
> -function repr(val) {
> -  if (val === undefined) {
> -    return null;
> -  } else if (val === null) {
> -    return "null";
> -  } else {
> -    return JSON.stringify(val);
> -  }
> -}
> -
>  function restartServer() {
>   var reply = CouchDB.request("POST", "/_restart");
>   do {
>
>
>



-- 
Chris Anderson
http://jchris.mfdz.com