X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=test%2Flib%2FTest%2FHarness%2FBrowser.js;fp=test%2Flib%2FTest%2FHarness%2FBrowser.js;h=4fa4cd2bcc41fe64a275b9f2f5b248f81353b0f7;hb=e7a29e42391160949dc35c1af4b0d24ee1c8ad8f;hp=0000000000000000000000000000000000000000;hpb=139a9cd7d495922b0f6e8f79d5fb3239db59b5ba;p=jquery.git diff --git a/test/lib/Test/Harness/Browser.js b/test/lib/Test/Harness/Browser.js new file mode 100644 index 0000000..4fa4cd2 --- /dev/null +++ b/test/lib/Test/Harness/Browser.js @@ -0,0 +1,176 @@ +// # $Id: Kinetic.pm 1493 2005-04-07 19:20:18Z theory $ + +if (typeof JSAN != 'undefined') new JSAN().use('Test.Harness'); + +Test.Harness.Browser = function () {}; +Test.Harness.Browser.VERSION = '0.11'; + +Test.Harness.Browser.runTests = function () { + var harness = new Test.Harness.Browser(); + harness.runTests.apply(harness, arguments); +}; + +Test.Harness.Browser.prototype = new Test.Harness(); +Test.Harness.Browser.prototype.interval = 100; + +Test.Harness.Browser.prototype._setupFrame = function (a) { + // Setup the iFrame to run the tests. + var node = document.getElementById('buffer'); + if (node) return node.contentWindow; + node = document.createElement("iframe"); + node.setAttribute("id", "buffer"); + node.setAttribute("name", "buffer"); + node.style.visibility = "hidden"; + node.style.height = 0; + node.style.width = 0; + document.body.appendChild(node); + + var self = this; + setTimeout( function(){ + self.buffer = node.contentWindow; + self._runTests.apply(self,a); + }, 200 ); +}; + +Test.Harness.Browser.prototype._setupOutput = function () { + // Setup the pre element for test output. + var node = document.createElement("pre"); + node.setAttribute("id", "output"); + document.body.appendChild(node); + return function (msg) { + node.appendChild(document.createTextNode(msg)); + window.scrollTo(0, document.body.offsetHeight + || document.body.scrollHeight); + }; +}; + +Test.Harness.Browser.prototype._setupSummary = function () { + // Setup the div for the summary. + var node = document.createElement("div"); + node.setAttribute("id", "summary"); + //node.setAttribute("style", "white-space:pre; font-family: Verdana,Arial,serif;"); + document.body.appendChild(node); + return function (msg) { + node.appendChild(document.createTextNode(msg)); + window.scrollTo(0, document.body.offsetHeight + || document.body.scrollHeight); + }; +}; + +Test.Harness.Browser.prototype.runTests = function () { + this._setupFrame(arguments); +} + +Test.Harness.Browser.prototype._runTests = function () { + var files = this.args.file + ? typeof this.args.file == 'string' ? [this.args.file] : this.args.file + : arguments; + if (!files.length) return; + var outfiles = this.outFileNames(files); + var buffer = this.buffer; + var harness = this; + var ti = 0; + var start; + var node = document.getElementById('output'); + var output = this._setupOutput(); + var summaryOutput = this._setupSummary(); + // These depend on how we're watching for a test to finish. + var finish = function () {}, runNext = function () {}; + + // This function handles most of the work of outputting results and + // running the next test, if there is one. + var runner = function () { + harness.outputResults( + buffer.Test.Builder.Test, + files[ti], + output, + harness.args + ); + + if (files[++ti]) { + output(outfiles[ti] + (harness.args.verbose ? Test.Harness.LF : '')); + buffer.location.href = files[ti] + "?" + start.getTime(); + runNext(); + } else { + harness.outputSummary( + summaryOutput, + new Date() - start + ); + finish(); + } + }; + + if (Object.watch) { + // We can use the cool watch method, and avoid setting timeouts! + // We just need to unwatch() when all tests are finished. + finish = function () { Test.Harness.unwatch('Done') }; + Test.Harness.watch('Done', function (attr, prev, next) { + if (next < buffer.Test.Builder.Instances.length) return next; + runner(); + return 0; + }); + } else { + // Damn. We have to set timeouts. :-( + var wait = function () { + // Check Test.Harness.Done. If it's non-zero, then we know that + // the buffer is fully loaded, because it has incremented + // Test.Harness.Done. + if (Test.Harness.Done > 0 + && Test.Harness.Done >= buffer.Test.Builder.Instances.length) + { + Test.Harness.Done = 0; + runner(); + } else { + window.setTimeout(wait, harness.interval); + } + }; + // We'll just have to set a timeout for the next test. + runNext = function () { window.setTimeout(wait, harness.interval); }; + window.setTimeout(wait, this.interval); + } + + // Now start the first test. + output(outfiles[ti] + (this.args.verbose ? Test.Harness.LF : '')); + start = new Date(); + buffer.location.href = files[ti] + "?" + start.getTime(); // replace() doesn't seem to work. +}; + +// From "JavaScript: The Difinitive Guide 4ed", p 214. +Test.Harness.Browser.prototype.args = {}; +var pairs = location.search.substring(1).split(","); +for (var i = 0; i < pairs.length; i++) { + var pos = pairs[i].indexOf('='); + if (pos == -1) continue; + var key = pairs[i].substring(0, pos); + var val = pairs[i].substring(pos + 1); + if (Test.Harness.Browser.prototype.args[key]) { + if (typeof Test.Harness.Browser.prototype.args[key] == 'string') { + Test.Harness.Browser.prototype.args[key] = + [Test.Harness.Browser.prototype.args[key]]; + } + Test.Harness.Browser.prototype.args[key].push(unescape(val)); + } else { + Test.Harness.Browser.prototype.args[key] = unescape(val); + } +} +delete pairs; + +Test.Harness.Browser.prototype.formatFailures = function (fn) { + // XXX append new element for table and then populate it. + var failedStr = "Failed Test"; + var middleStr = " Total Fail Failed "; + var listStr = "List of Failed"; + var table = '' + + ''; + for (var i = 0; i < this.failures.length; i++) { + var track = this.failures[i]; + table += '' + + '' + + '' + + '' + }; + table += '
Failed TestTotalFailFailed
' + track.fn + '' + track.total + '' + track.total - track.ok + '' + this._failList(track.failList) + '
' + Test.Harness.LF; + var node = document.getElementById('summary'); + node.innerHTML += table; + window.scrollTo(0, document.body.offsetHeight || document.body.scrollHeight); +};