| 1 | var TestDoc = { |
| 2 | fails: 0, |
| 3 | plans: 0, |
| 4 | passes: 0, |
| 5 | results: [] |
| 6 | }; |
| 7 | |
| 8 | TestDoc.record = function(result) { |
| 9 | TestDoc.results.push(result); |
| 10 | if (typeof result.verdict == "boolean") { |
| 11 | if (result.verdict === false) TestDoc.fails++; |
| 12 | if (result.verdict === true) TestDoc.passes++; |
| 13 | } |
| 14 | } |
| 15 | |
| 16 | TestDoc.prove = function(filePath) { |
| 17 | if (typeof document != "undefined" && typeof document.write != "undefined") { |
| 18 | if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); } |
| 19 | else print = function(s) { document.write(s+"<br />"); } |
| 20 | } |
| 21 | TestDoc.run(TestDoc.readFile(filePath)); |
| 22 | } |
| 23 | |
| 24 | TestDoc.run = function(src) { |
| 25 | try { eval(src); } catch(e) { print("# ERROR! "+e); } |
| 26 | |
| 27 | var chunks = src.split(/\/\*t:/); |
| 28 | |
| 29 | var run = function(chunk) { |
| 30 | // local shortcuts |
| 31 | var is = TestDoc.assertEquals; |
| 32 | var isnt = TestDoc.assertNotEquals; |
| 33 | var plan = TestDoc.plan; |
| 34 | var requires = TestDoc.requires; |
| 35 | |
| 36 | try { eval(chunk); } catch(e) { print("# ERROR! "+e); } |
| 37 | } |
| 38 | for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) { |
| 39 | run( |
| 40 | src.substring( |
| 41 | start+4, |
| 42 | (end = src.indexOf("*/", start)) |
| 43 | ) |
| 44 | ); |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | TestDoc.Result = function(verdict, message) { |
| 49 | this.verdict = verdict; |
| 50 | this.message = message; |
| 51 | } |
| 52 | |
| 53 | TestDoc.Result.prototype.toString = function() { |
| 54 | if (typeof this.verdict == "boolean") { |
| 55 | return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message; |
| 56 | } |
| 57 | |
| 58 | return "# " + this.message; |
| 59 | } |
| 60 | |
| 61 | TestDoc.requires = function(file) { |
| 62 | if (!TestDoc.requires.loaded[file]) { |
| 63 | load(file); |
| 64 | TestDoc.requires.loaded[file] = true; |
| 65 | } |
| 66 | } |
| 67 | TestDoc.requires.loaded = {}; |
| 68 | |
| 69 | TestDoc.report = function() { |
| 70 | TestDoc.report.counter = 0; |
| 71 | print("1.."+TestDoc.plans); |
| 72 | for (var i = 0; i < TestDoc.results.length; i++) { |
| 73 | print(TestDoc.results[i]); |
| 74 | } |
| 75 | print("----------------------------------------"); |
| 76 | if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) { |
| 77 | print("All tests successful."); |
| 78 | } |
| 79 | else { |
| 80 | print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".") |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | TestDoc.plan = function(n, message) { |
| 85 | TestDoc.plans += n; |
| 86 | TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)")); |
| 87 | } |
| 88 | |
| 89 | TestDoc.assertEquals = function(a, b, message) { |
| 90 | var result = (a == b); |
| 91 | if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#"; |
| 92 | TestDoc.record(new TestDoc.Result(result, message)); |
| 93 | } |
| 94 | |
| 95 | TestDoc.assertNotEquals = function(a, b, message) { |
| 96 | var result = (a != b); |
| 97 | if (!result) message += "\n#\n# " + a + " equals " + b + "\n#"; |
| 98 | TestDoc.record(new TestDoc.Result(result, message)); |
| 99 | } |
| 100 | |
| 101 | TestDoc.readFile = (function(){ |
| 102 | // rhino |
| 103 | if (typeof readFile == "function") { |
| 104 | return function(url) { |
| 105 | var text = readFile(url); |
| 106 | return text || ""; |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | // a web browser |
| 111 | else { |
| 112 | return function(url) { |
| 113 | var httpRequest; |
| 114 | |
| 115 | if (window.XMLHttpRequest) { // Mozilla, Safari, etc |
| 116 | httpRequest = new XMLHttpRequest(); |
| 117 | } |
| 118 | else if (window.ActiveXObject) { // IE |
| 119 | try { |
| 120 | httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); |
| 121 | } |
| 122 | catch (e) { |
| 123 | try { |
| 124 | httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); |
| 125 | } |
| 126 | catch (e) { |
| 127 | } |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | if (!httpRequest) { throw "Cannot create HTTP Request."; } |
| 132 | |
| 133 | httpRequest.open('GET', url, false); |
| 134 | httpRequest.send(''); |
| 135 | if (httpRequest.readyState == 4) { |
| 136 | if (httpRequest.status >= 400) { |
| 137 | throw "The HTTP Request returned an error code: "+httpRequest.status; |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | return httpRequest.responseText || ""; |
| 142 | } |
| 143 | } |
| 144 | })(); |