|
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 })(); |