From d2a6bdbe68ae65aee21d9267e9985fe611bf6e7c Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Mon, 17 Nov 2008 22:14:14 +0000 Subject: factored couch_test_runner.js out from couch_tests.js, made it usuable for unit testing views from design docs git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@718409 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/couch_tests.html | 16 ++- share/www/index.html | 2 +- share/www/script/browse.js | 8 +- share/www/script/couch_test_runner.js | 181 ++++++++++++++++++++++++++++++++++ share/www/script/couch_tests.js | 166 ------------------------------- 5 files changed, 196 insertions(+), 177 deletions(-) create mode 100644 share/www/script/couch_test_runner.js (limited to 'share') diff --git a/share/www/couch_tests.html b/share/www/couch_tests.html index 4de4fcdb..f1ab443b 100644 --- a/share/www/couch_tests.html +++ b/share/www/couch_tests.html @@ -22,20 +22,18 @@ specific language governing permissions and limitations under the License. + - - diff --git a/share/www/index.html b/share/www/index.html index b6919b93..37217384 100644 --- a/share/www/index.html +++ b/share/www/index.html @@ -87,7 +87,7 @@ specific language governing permissions and limitations under the License.
  • Overview
  • Replicator
  • Configuration
  • -
  • Test Suite
  • +
  • Test Suite
  • Recent Databases diff --git a/share/www/script/browse.js b/share/www/script/browse.js index 6abcb073..dde31c05 100644 --- a/share/www/script/browse.js +++ b/share/www/script/browse.js @@ -873,12 +873,18 @@ function CouchDocumentPage() { } function _renderAttachmentItem(name, attachment) { + var attachmentHref = db.uri + encodeURIComponent(docId) + + "/" + encodeURIComponent(name); var li = $("
  • "); $("").text(name) - .attr("href", db.uri + encodeURIComponent(docId) + "/" + encodeURIComponent(name)) + .attr("href", attachmentHref) .wrapInner("").appendTo(li); $("()").text("" + prettyPrintSize(attachment.length) + ", " + attachment.content_type).addClass("info").appendTo(li); + if (name == "tests.js") { + li.find('span.info').append(', open in test runner'); + } _initAttachmentItem(name, attachment, li); return li; } diff --git a/share/www/script/couch_test_runner.js b/share/www/script/couch_test_runner.js new file mode 100644 index 00000000..59eafcde --- /dev/null +++ b/share/www/script/couch_test_runner.js @@ -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(''); +}; + +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(" "); + $("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(" "); + 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) { + $("
      ").appendTo($("td.details", row)); + } + $("
    1. Exception raised:
    2. ") + .find("code").text(JSON.stringify(e)).end() + .appendTo($("td.details ol", row)); + if (debug) { + currentRow = null; + throw e; + } + } + if ($("td.details ol", row).length) { + $("Run with debugger").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; + $("
      ").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 = $("")
      +      .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(" ").end()
      +      .find("td:nth(2)").addClass("details").html(" ").end();
      +    $("").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) {
      +        $("
        ").appendTo($("td.details", currentRow)); + } + $("
      1. Assertion failed:
      2. ") + .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 diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js index 3c14b761..722d3113 100644 --- a/share/www/script/couch_tests.js +++ b/share/www/script/couch_tests.js @@ -2067,172 +2067,6 @@ function makeDocs(start, end, templateDoc) { 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(" "); - $("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(" "); - 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) { - $("
          ").appendTo($("td.details", row)); - } - $("
        1. Exception raised:
        2. ") - .find("code").text(JSON.stringify(e)).end() - .appendTo($("td.details ol", row)); - if (debug) { - currentRow = null; - throw e; - } - } - if ($("td.details ol", row).length) { - $("Run with debugger").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; - $("
          ").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 = $("")
          -      .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(" ").end()
          -      .find("td:nth(2)").addClass("details").html(" ").end();
          -    $("").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) {
          -        $("
            ").appendTo($("td.details", currentRow)); - } - $("
          1. Assertion failed:
          2. ") - .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 { -- cgit v1.2.3