]> git.cworth.org Git - obsolete/notmuch-web/blob - node_modules/express/node_modules/qs/support/expresso/docs/api.html
Install the "express" node module via npm
[obsolete/notmuch-web] / node_modules / express / node_modules / qs / support / expresso / docs / api.html
1 <a href="http://github.com/visionmedia/expresso"><img alt="Fork me on GitHub" id="ribbon" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a><html>
2         <head>
3                 <title>Expresso</title>
4                 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
5                 <style>body {
6     margin: 0;
7     padding: 0;
8     font: 14px/1.5 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
9     color: #252519;
10 }
11 a {
12     color: #252519;
13 }
14 a:hover {
15     text-decoration: underline;
16     color: #19469D;
17 }
18 p {
19     margin: 12px 0;
20 }
21 h1, h2, h3 {
22     margin: 0;
23     padding: 0;
24 }
25 table#source {
26     width: 100%;
27     border-collapse: collapse;
28 }
29 table#source td:first-child {
30     padding: 30px 40px 30px 40px;
31     vertical-align: top;
32 }
33 table#source td:first-child,
34 table#source td:first-child pre {
35     width: 450px;
36 }
37 table#source td:last-child {
38     padding: 30px 0 30px 40px;
39     border-left: 1px solid #E5E5EE;
40     background: #F5F5FF;
41 }
42 table#source tr {
43     border-bottom: 1px solid #E5E5EE;
44 }
45 table#source tr.filename {
46     padding-top: 40px;
47     border-top: 1px solid #E5E5EE;
48 }
49 table#source tr.filename td:first-child {
50     text-transform: capitalize;
51 }
52 table#source tr.filename td:last-child {
53     font-size: 12px;
54 }
55 table#source tr.filename h2 {
56     margin: 0;
57     padding: 0;
58     cursor: pointer;
59 }
60 table#source tr.code h1,
61 table#source tr.code h2,
62 table#source tr.code h3 {
63     margin-top: 30px;
64     font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
65     font-size: 18px;
66 }
67 table#source tr.code h2 {
68     font-size: 16px;
69 }
70 table#source tr.code h3 {
71     font-size: 14px;
72 }
73 table#source tr.code ul {
74     margin: 15px 0 15px 35px;
75     padding: 0;
76 }
77 table#source tr.code ul li {
78     margin: 0;
79     padding: 1px 0;
80 }
81 table#source tr.code ul li p {
82     margin: 0;
83     padding: 0;
84 }
85 table#source tr.code td:first-child pre {
86     padding: 20px;
87 }
88 #ribbon {
89     position: fixed;
90     top: 0;
91     right: 0;
92 }
93 code .string { color: #219161; }
94 code .regexp { color: #219161; }
95 code .keyword { color: #954121; }
96 code .number { color: #19469D; }
97 code .comment { color: #bbb; }
98 code .this { color: #19469D; }</style>
99                 <script>
100                         $(function(){
101                                 $('tr.code').hide();
102                                 $('tr.filename').toggle(function(){
103                                         $(this).nextUntil('.filename').fadeIn();
104                                 }, function(){
105                                         $(this).nextUntil('.filename').fadeOut();
106                                 });
107                         });
108                 </script>
109         </head>
110         <body>
111 <table id="source"><tbody><tr><td><h1>Expresso</h1><p>Insanely fast TDD framework for <a href="http://nodejs.org">node</a> featuring code coverage reporting.</p></td><td></td></tr><tr class="filename"><td><h2 id="bin/expresso"><a href="#">expresso</a></h2></td><td>bin/expresso</td></tr><tr class="code">
112 <td class="docs">
113 <h1>!/usr/bin/env node</h1>
114 </td>
115 <td class="code">
116 <pre><code>
117  * <span class="class">Expresso</span>
118  * <span class="class">Copyright</span>(<span class="variable">c</span>) <span class="class">TJ</span> <span class="class">Holowaychuk</span> &<span class="variable">lt</span>;<span class="variable">tj</span>@<span class="variable">vision</span>-<span class="variable">media</span>.<span class="variable">ca</span>&<span class="variable">gt</span>;
119  * (<span class="class">MIT</span> <span class="class">Licensed</span>)
120  </code></pre>
121 </td>
122 </tr>
123 <tr class="code">
124 <td class="docs">
125 <p>Module dependencies.
126  </p>
127 </td>
128 <td class="code">
129 <pre><code><span class="keyword">var</span> <span class="variable">assert</span> = <span class="variable">require</span>(<span class="string">'assert'</span>),
130     <span class="variable">childProcess</span> = <span class="variable">require</span>(<span class="string">'child_process'</span>),
131     <span class="variable">http</span> = <span class="variable">require</span>(<span class="string">'http'</span>),
132     <span class="variable">path</span> = <span class="variable">require</span>(<span class="string">'path'</span>),
133     <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
134     <span class="variable">cwd</span> = <span class="variable">process</span>.<span class="variable">cwd</span>(),
135     <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>),
136     <span class="variable">defer</span>;</code></pre>
137 </td>
138 </tr>
139 <tr class="code">
140 <td class="docs">
141 <p>Expresso version.
142  </p>
143 </td>
144 <td class="code">
145 <pre><code><span class="keyword">var</span> <span class="variable">version</span> = <span class="string">'0.6.4'</span>;</code></pre>
146 </td>
147 </tr>
148 <tr class="code">
149 <td class="docs">
150 <p>Failure count.
151  </p>
152 </td>
153 <td class="code">
154 <pre><code><span class="keyword">var</span> <span class="variable">failures</span> = <span class="number integer">0</span>;</code></pre>
155 </td>
156 </tr>
157 <tr class="code">
158 <td class="docs">
159 <p>Number of tests executed.
160  </p>
161 </td>
162 <td class="code">
163 <pre><code><span class="keyword">var</span> <span class="variable">testcount</span> = <span class="number integer">0</span>;</code></pre>
164 </td>
165 </tr>
166 <tr class="code">
167 <td class="docs">
168 <p>Whitelist of tests to run.
169  </p>
170 </td>
171 <td class="code">
172 <pre><code><span class="keyword">var</span> <span class="variable">only</span> = [];</code></pre>
173 </td>
174 </tr>
175 <tr class="code">
176 <td class="docs">
177 <p>Boring output.
178  </p>
179 </td>
180 <td class="code">
181 <pre><code><span class="keyword">var</span> <span class="variable">boring</span> = <span class="variable">false</span>;</code></pre>
182 </td>
183 </tr>
184 <tr class="code">
185 <td class="docs">
186 <p>Growl notifications.
187  </p>
188 </td>
189 <td class="code">
190 <pre><code><span class="keyword">var</span> <span class="variable">growl</span> = <span class="variable">false</span>;</code></pre>
191 </td>
192 </tr>
193 <tr class="code">
194 <td class="docs">
195 <p>Server port.
196  </p>
197 </td>
198 <td class="code">
199 <pre><code><span class="keyword">var</span> <span class="variable">port</span> = <span class="number integer">5555</span>;</code></pre>
200 </td>
201 </tr>
202 <tr class="code">
203 <td class="docs">
204 <p>Watch mode.
205  </p>
206 </td>
207 <td class="code">
208 <pre><code><span class="keyword">var</span> <span class="variable">watch</span> = <span class="variable">false</span>;</code></pre>
209 </td>
210 </tr>
211 <tr class="code">
212 <td class="docs">
213 <p>Execute serially.
214  </p>
215 </td>
216 <td class="code">
217 <pre><code><span class="keyword">var</span> <span class="variable">serial</span> = <span class="variable">false</span>;</code></pre>
218 </td>
219 </tr>
220 <tr class="code">
221 <td class="docs">
222 <p>Default timeout.
223  </p>
224 </td>
225 <td class="code">
226 <pre><code><span class="keyword">var</span> <span class="variable">timeout</span> = <span class="number integer">2000</span>;</code></pre>
227 </td>
228 </tr>
229 <tr class="code">
230 <td class="docs">
231 <p>Usage documentation.
232  </p>
233 </td>
234 <td class="code">
235 <pre><code><span class="keyword">var</span> <span class="variable">usage</span> = <span class="string">''</span>
236     + <span class="string">'[bold]{Usage}: expresso [options] &lt;file ...&gt;'</span>
237     + <span class="string">'\n'</span>
238     + <span class="string">'\n[bold]{Options}:'</span>
239     + <span class="string">'\n  -w, --watch          Watch for modifications and re-execute tests'</span>
240     + <span class="string">'\n  -g, --growl          Enable growl notifications'</span>
241     + <span class="string">'\n  -c, --coverage       Generate and report test coverage'</span>
242     + <span class="string">'\n  -t, --timeout MS     Timeout in milliseconds, defaults to 2000'</span>
243     + <span class="string">'\n  -r, --require PATH   Require the given module path'</span>
244     + <span class="string">'\n  -o, --only TESTS     Execute only the comma sperated TESTS (can be set several times)'</span>
245     + <span class="string">'\n  -I, --include PATH   Unshift the given path to require.paths'</span>
246     + <span class="string">'\n  -p, --port NUM       Port number for test servers, starts at 5555'</span>
247     + <span class="string">'\n  -s, --serial         Execute tests serially'</span>
248     + <span class="string">'\n  -b, --boring         Suppress ansi-escape colors'</span>
249     + <span class="string">'\n  -v, --version        Output version number'</span>
250     + <span class="string">'\n  -h, --help           Display help information'</span>
251     + <span class="string">'\n'</span>;
252
253 <span class="comment">// Parse arguments</span>
254
255 <span class="keyword">var</span> <span class="variable">files</span> = [],
256     <span class="variable">args</span> = <span class="variable">process</span>.<span class="variable">argv</span>.<span class="variable">slice</span>(<span class="number integer">2</span>);
257
258 <span class="keyword">while</span> (<span class="variable">args</span>.<span class="variable">length</span>) {
259     <span class="keyword">var</span> <span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>();
260     <span class="keyword">switch</span> (<span class="variable">arg</span>) {
261         <span class="keyword">case</span> <span class="string">'-h'</span>:
262         <span class="keyword">case</span> <span class="string">'--help'</span>:
263             <span class="variable">print</span>(<span class="variable">usage</span> + <span class="string">'\n'</span>);
264             <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
265             <span class="keyword">break</span>;
266         <span class="keyword">case</span> <span class="string">'-v'</span>:
267         <span class="keyword">case</span> <span class="string">'--version'</span>:
268             <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">version</span>);
269             <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
270             <span class="keyword">break</span>;
271         <span class="keyword">case</span> <span class="string">'-i'</span>:
272         <span class="keyword">case</span> <span class="string">'-I'</span>:
273         <span class="keyword">case</span> <span class="string">'--include'</span>:
274             <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
275                 <span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="variable">arg</span>);
276             } <span class="keyword">else</span> {
277                 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--include requires a path'</span>);
278             }
279             <span class="keyword">break</span>;
280         <span class="keyword">case</span> <span class="string">'-o'</span>:
281         <span class="keyword">case</span> <span class="string">'--only'</span>:
282             <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
283                 <span class="variable">only</span> = <span class="variable">only</span>.<span class="variable">concat</span>(<span class="variable">arg</span>.<span class="variable">split</span>(<span class="regexp">/ *, */</span>));
284             } <span class="keyword">else</span> {
285                 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--only requires comma-separated test names'</span>);
286             }
287             <span class="keyword">break</span>;
288         <span class="keyword">case</span> <span class="string">'-p'</span>:
289         <span class="keyword">case</span> <span class="string">'--port'</span>:
290             <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
291                 <span class="variable">port</span> = <span class="variable">parseInt</span>(<span class="variable">arg</span>, <span class="number integer">10</span>);
292             } <span class="keyword">else</span> {
293                 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--port requires a number'</span>);
294             }
295             <span class="keyword">break</span>;
296         <span class="keyword">case</span> <span class="string">'-r'</span>:
297         <span class="keyword">case</span> <span class="string">'--require'</span>:
298             <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
299                 <span class="variable">require</span>(<span class="variable">arg</span>);
300             } <span class="keyword">else</span> {
301                 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--require requires a path'</span>);
302             }
303             <span class="keyword">break</span>;
304         <span class="keyword">case</span> <span class="string">'-t'</span>:
305         <span class="keyword">case</span> <span class="string">'--timeout'</span>:
306           <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
307             <span class="variable">timeout</span> = <span class="variable">parseInt</span>(<span class="variable">arg</span>, <span class="number integer">10</span>);
308           } <span class="keyword">else</span> {
309             <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--timeout requires an argument'</span>);
310           }
311           <span class="keyword">break</span>;
312         <span class="keyword">case</span> <span class="string">'-c'</span>:
313         <span class="keyword">case</span> <span class="string">'--cov'</span>:
314         <span class="keyword">case</span> <span class="string">'--coverage'</span>:
315             <span class="variable">defer</span> = <span class="variable">true</span>;
316             <span class="variable">childProcess</span>.<span class="variable">exec</span>(<span class="string">'rm -fr lib-cov &amp;&amp; node-jscoverage lib lib-cov'</span>, <span class="keyword">function</span>(<span class="variable">err</span>){
317                 <span class="keyword">if</span> (<span class="variable">err</span>) <span class="keyword">throw</span> <span class="variable">err</span>;
318                 <span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="string">'lib-cov'</span>);
319                 <span class="variable">run</span>(<span class="variable">files</span>);
320             })
321             <span class="keyword">break</span>;
322         <span class="keyword">case</span> <span class="string">'-b'</span>:
323         <span class="keyword">case</span> <span class="string">'--boring'</span>:
324                 <span class="variable">boring</span> = <span class="variable">true</span>;
325                 <span class="keyword">break</span>;
326         <span class="keyword">case</span> <span class="string">'-w'</span>:
327         <span class="keyword">case</span> <span class="string">'--watch'</span>:
328             <span class="variable">watch</span> = <span class="variable">true</span>;
329             <span class="keyword">break</span>;
330         <span class="keyword">case</span> <span class="string">'-g'</span>:
331         <span class="keyword">case</span> <span class="string">'--growl'</span>:
332             <span class="variable">growl</span> = <span class="variable">true</span>;
333             <span class="keyword">break</span>;
334         <span class="keyword">case</span> <span class="string">'-s'</span>:
335         <span class="keyword">case</span> <span class="string">'--serial'</span>:
336             <span class="variable">serial</span> = <span class="variable">true</span>;
337             <span class="keyword">break</span>;
338         <span class="keyword">default</span>:
339             <span class="keyword">if</span> (<span class="regexp">/\.js$/</span>.<span class="variable">test</span>(<span class="variable">arg</span>)) {
340                 <span class="variable">files</span>.<span class="variable">push</span>(<span class="variable">arg</span>);
341             }
342             <span class="keyword">break</span>;
343     }
344 }</code></pre>
345 </td>
346 </tr>
347 <tr class="code">
348 <td class="docs">
349 <p>Colorized sys.error().</p>
350
351 <h2></h2>
352
353 <ul><li><p><strong>param</strong>: <em>String</em>  str</p></li></ul>
354 </td>
355 <td class="code">
356 <pre><code><span class="keyword">function</span> <span class="variable">print</span>(<span class="variable">str</span>){
357     <span class="variable">sys</span>.<span class="variable">error</span>(<span class="variable">colorize</span>(<span class="variable">str</span>));
358 }</code></pre>
359 </td>
360 </tr>
361 <tr class="code">
362 <td class="docs">
363 <p>Colorize the given string using ansi-escape sequences.
364 Disabled when --boring is set.</p>
365
366 <h2></h2>
367
368 <ul><li><p><strong>param</strong>: <em>String</em>  str</p></li><li><p><strong>return</strong>: <em>String</em> </p></li></ul>
369 </td>
370 <td class="code">
371 <pre><code><span class="keyword">function</span> <span class="variable">colorize</span>(<span class="variable">str</span>){
372     <span class="keyword">var</span> <span class="variable">colors</span> = { <span class="variable">bold</span>: <span class="number integer">1</span>, <span class="variable">red</span>: <span class="number integer">31</span>, <span class="variable">green</span>: <span class="number integer">32</span>, <span class="variable">yellow</span>: <span class="number integer">33</span> };
373     <span class="keyword">return</span> <span class="variable">str</span>.<span class="variable">replace</span>(<span class="regexp">/\[(\w+)\]\{([^]*?)\}/g</span>, <span class="keyword">function</span>(<span class="variable">_</span>, <span class="variable">color</span>, <span class="variable">str</span>){
374         <span class="keyword">return</span> <span class="variable">boring</span>
375             ? <span class="variable">str</span>
376             : <span class="string">'\x1B['</span> + <span class="variable">colors</span>[<span class="variable">color</span>] + <span class="string">'m'</span> + <span class="variable">str</span> + <span class="string">'\x1B[0m'</span>;
377     });
378 }
379
380 <span class="comment">// Alias deepEqual as eql for complex equality</span>
381
382 <span class="variable">assert</span>.<span class="variable">eql</span> = <span class="variable">assert</span>.<span class="variable">deepEqual</span>;</code></pre>
383 </td>
384 </tr>
385 <tr class="code">
386 <td class="docs">
387 <p>Assert that <code>val</code> is null.</p>
388
389 <h2></h2>
390
391 <ul><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
392 </td>
393 <td class="code">
394 <pre><code><span class="variable">assert</span>.<span class="variable">isNull</span> = <span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">msg</span>) {
395     <span class="variable">assert</span>.<span class="variable">strictEqual</span>(<span class="keyword">null</span>, <span class="variable">val</span>, <span class="variable">msg</span>);
396 };</code></pre>
397 </td>
398 </tr>
399 <tr class="code">
400 <td class="docs">
401 <p>Assert that <code>val</code> is not null.</p>
402
403 <h2></h2>
404
405 <ul><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
406 </td>
407 <td class="code">
408 <pre><code><span class="variable">assert</span>.<span class="variable">isNotNull</span> = <span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">msg</span>) {
409     <span class="variable">assert</span>.<span class="variable">notStrictEqual</span>(<span class="keyword">null</span>, <span class="variable">val</span>, <span class="variable">msg</span>);
410 };</code></pre>
411 </td>
412 </tr>
413 <tr class="code">
414 <td class="docs">
415 <p>Assert that <code>val</code> is undefined.</p>
416
417 <h2></h2>
418
419 <ul><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
420 </td>
421 <td class="code">
422 <pre><code><span class="variable">assert</span>.<span class="variable">isUndefined</span> = <span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">msg</span>) {
423     <span class="variable">assert</span>.<span class="variable">strictEqual</span>(<span class="variable">undefined</span>, <span class="variable">val</span>, <span class="variable">msg</span>);
424 };</code></pre>
425 </td>
426 </tr>
427 <tr class="code">
428 <td class="docs">
429 <p>Assert that <code>val</code> is not undefined.</p>
430
431 <h2></h2>
432
433 <ul><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
434 </td>
435 <td class="code">
436 <pre><code><span class="variable">assert</span>.<span class="variable">isDefined</span> = <span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">msg</span>) {
437     <span class="variable">assert</span>.<span class="variable">notStrictEqual</span>(<span class="variable">undefined</span>, <span class="variable">val</span>, <span class="variable">msg</span>);
438 };</code></pre>
439 </td>
440 </tr>
441 <tr class="code">
442 <td class="docs">
443 <p>Assert that <code>obj</code> is <code>type</code>.</p>
444
445 <h2></h2>
446
447 <ul><li><p><strong>param</strong>: <em>Mixed</em>  obj</p></li><li><p><strong>param</strong>: <em>String</em>  type</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
448 </td>
449 <td class="code">
450 <pre><code><span class="variable">assert</span>.<span class="variable">type</span> = <span class="keyword">function</span>(<span class="variable">obj</span>, <span class="variable">type</span>, <span class="variable">msg</span>){
451     <span class="keyword">var</span> <span class="variable">real</span> = <span class="keyword">typeof</span> <span class="variable">obj</span>;
452     <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="string">'typeof '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">obj</span>) + <span class="string">' is '</span> + <span class="variable">real</span> + <span class="string">', expected '</span> + <span class="variable">type</span>;
453     <span class="variable">assert</span>.<span class="variable">ok</span>(<span class="variable">type</span> === <span class="variable">real</span>, <span class="variable">msg</span>);
454 };</code></pre>
455 </td>
456 </tr>
457 <tr class="code">
458 <td class="docs">
459 <p>Assert that <code>str</code> matches <code>regexp</code>.</p>
460
461 <h2></h2>
462
463 <ul><li><p><strong>param</strong>: <em>String</em>  str</p></li><li><p><strong>param</strong>: <em>RegExp</em>  regexp</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
464 </td>
465 <td class="code">
466 <pre><code><span class="variable">assert</span>.<span class="variable">match</span> = <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">regexp</span>, <span class="variable">msg</span>) {
467     <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">str</span>) + <span class="string">' does not match '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">regexp</span>);
468     <span class="variable">assert</span>.<span class="variable">ok</span>(<span class="variable">regexp</span>.<span class="variable">test</span>(<span class="variable">str</span>), <span class="variable">msg</span>);
469 };</code></pre>
470 </td>
471 </tr>
472 <tr class="code">
473 <td class="docs">
474 <p>Assert that <code>val</code> is within <code>obj</code>.</p>
475
476 <h2>Examples</h2>
477
478 <p>   assert.includes('foobar', 'bar');
479    assert.includes(['foo', 'bar'], 'foo');</p>
480
481 <h2></h2>
482
483 <ul><li><p><strong>param</strong>: <em>String | Array</em>  obj</p></li><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
484 </td>
485 <td class="code">
486 <pre><code><span class="variable">assert</span>.<span class="variable">includes</span> = <span class="keyword">function</span>(<span class="variable">obj</span>, <span class="variable">val</span>, <span class="variable">msg</span>) {
487     <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">obj</span>) + <span class="string">' does not include '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">val</span>);
488     <span class="variable">assert</span>.<span class="variable">ok</span>(<span class="variable">obj</span>.<span class="variable">indexOf</span>(<span class="variable">val</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>, <span class="variable">msg</span>);
489 };</code></pre>
490 </td>
491 </tr>
492 <tr class="code">
493 <td class="docs">
494 <p>Assert length of <code>val</code> is <code>n</code>.</p>
495
496 <h2></h2>
497
498 <ul><li><p><strong>param</strong>: <em>Mixed</em>  val</p></li><li><p><strong>param</strong>: <em>Number</em>  n</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
499 </td>
500 <td class="code">
501 <pre><code><span class="variable">assert</span>.<span class="variable">length</span> = <span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">n</span>, <span class="variable">msg</span>) {
502     <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">val</span>) + <span class="string">' has length of '</span> + <span class="variable">val</span>.<span class="variable">length</span> + <span class="string">', expected '</span> + <span class="variable">n</span>;
503     <span class="variable">assert</span>.<span class="variable">equal</span>(<span class="variable">n</span>, <span class="variable">val</span>.<span class="variable">length</span>, <span class="variable">msg</span>);
504 };</code></pre>
505 </td>
506 </tr>
507 <tr class="code">
508 <td class="docs">
509 <p>Assert response from <code>server</code> with
510 the given <code>req</code> object and <code>res</code> assertions object.</p>
511
512 <h2></h2>
513
514 <ul><li><p><strong>param</strong>: <em>Server</em>  server</p></li><li><p><strong>param</strong>: <em>Object</em>  req</p></li><li><p><strong>param</strong>: <em>Object | Function</em>  res</p></li><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
515 </td>
516 <td class="code">
517 <pre><code><span class="variable">assert</span>.<span class="variable">response</span> = <span class="keyword">function</span>(<span class="variable">server</span>, <span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">msg</span>){
518     <span class="comment">// Callback as third or fourth arg</span>
519     <span class="keyword">var</span> <span class="variable">callback</span> = <span class="keyword">typeof</span> <span class="variable">res</span> === <span class="string">'function'</span>
520         ? <span class="variable">res</span>
521         : <span class="keyword">typeof</span> <span class="variable">msg</span> === <span class="string">'function'</span>
522             ? <span class="variable">msg</span>
523             : <span class="keyword">function</span>(){};
524
525     <span class="comment">// Default messate to test title</span>
526     <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">msg</span> === <span class="string">'function'</span>) <span class="variable">msg</span> = <span class="keyword">null</span>;
527     <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">assert</span>.<span class="variable">testTitle</span>;
528     <span class="variable">msg</span> += <span class="string">'. '</span>;
529
530     <span class="comment">// Pending responses</span>
531     <span class="variable">server</span>.<span class="variable">__pending</span> = <span class="variable">server</span>.<span class="variable">__pending</span> || <span class="number integer">0</span>;
532     <span class="variable">server</span>.<span class="variable">__pending</span>++;
533
534     <span class="comment">// Create client</span>
535     <span class="keyword">if</span> (!<span class="variable">server</span>.<span class="variable">fd</span>) {
536         <span class="variable">server</span>.<span class="variable">listen</span>(<span class="variable">server</span>.<span class="variable">__port</span> = <span class="variable">port</span>++, <span class="string">'127.0.0.1'</span>);
537         <span class="variable">server</span>.<span class="variable">client</span> = <span class="variable">http</span>.<span class="variable">createClient</span>(<span class="variable">server</span>.<span class="variable">__port</span>);
538     }
539
540     <span class="comment">// Issue request</span>
541     <span class="keyword">var</span> <span class="variable">timer</span>,
542         <span class="variable">client</span> = <span class="variable">server</span>.<span class="variable">client</span>,
543         <span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">method</span> || <span class="string">'GET'</span>,
544         <span class="variable">status</span> = <span class="variable">res</span>.<span class="variable">status</span> || <span class="variable">res</span>.<span class="variable">statusCode</span>,
545         <span class="variable">data</span> = <span class="variable">req</span>.<span class="variable">data</span> || <span class="variable">req</span>.<span class="variable">body</span>,
546         <span class="variable">requestTimeout</span> = <span class="variable">req</span>.<span class="variable">timeout</span> || <span class="number integer">0</span>;
547
548     <span class="keyword">var</span> <span class="variable">request</span> = <span class="variable">client</span>.<span class="variable">request</span>(<span class="variable">method</span>, <span class="variable">req</span>.<span class="variable">url</span>, <span class="variable">req</span>.<span class="variable">headers</span>);
549
550     <span class="comment">// Timeout</span>
551     <span class="keyword">if</span> (<span class="variable">requestTimeout</span>) {
552         <span class="variable">timer</span> = <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){
553             --<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
554             <span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">timeout</span>;
555             <span class="variable">assert</span>.<span class="variable">fail</span>(<span class="variable">msg</span> + <span class="string">'Request timed out after '</span> + <span class="variable">requestTimeout</span> + <span class="string">'ms.'</span>);
556         }, <span class="variable">requestTimeout</span>);
557     }
558
559     <span class="keyword">if</span> (<span class="variable">data</span>) <span class="variable">request</span>.<span class="variable">write</span>(<span class="variable">data</span>);
560     <span class="variable">request</span>.<span class="variable">addListener</span>(<span class="string">'response'</span>, <span class="keyword">function</span>(<span class="variable">response</span>){
561         <span class="variable">response</span>.<span class="variable">body</span> = <span class="string">''</span>;
562         <span class="variable">response</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>);
563         <span class="variable">response</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span>(<span class="variable">chunk</span>){ <span class="variable">response</span>.<span class="variable">body</span> += <span class="variable">chunk</span>; });
564         <span class="variable">response</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>(){
565             --<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
566             <span class="keyword">if</span> (<span class="variable">timer</span>) <span class="variable">clearTimeout</span>(<span class="variable">timer</span>);
567
568             <span class="comment">// Assert response body</span>
569             <span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">body</span> !== <span class="variable">undefined</span>) {
570                 <span class="keyword">var</span> <span class="variable">eql</span> = <span class="variable">res</span>.<span class="variable">body</span> <span class="variable">instanceof</span> <span class="class">RegExp</span>
571                   ? <span class="variable">res</span>.<span class="variable">body</span>.<span class="variable">test</span>(<span class="variable">response</span>.<span class="variable">body</span>)
572                   : <span class="variable">res</span>.<span class="variable">body</span> === <span class="variable">response</span>.<span class="variable">body</span>;
573                 <span class="variable">assert</span>.<span class="variable">ok</span>(
574                     <span class="variable">eql</span>,
575                     <span class="variable">msg</span> + <span class="string">'Invalid response body.\n'</span>
576                         + <span class="string">'    Expected: '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">res</span>.<span class="variable">body</span>) + <span class="string">'\n'</span>
577                         + <span class="string">'    Got: '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">response</span>.<span class="variable">body</span>)
578                 );
579             }
580
581             <span class="comment">// Assert response status</span>
582             <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">status</span> === <span class="string">'number'</span>) {
583                 <span class="variable">assert</span>.<span class="variable">equal</span>(
584                     <span class="variable">response</span>.<span class="variable">statusCode</span>,
585                     <span class="variable">status</span>,
586                     <span class="variable">msg</span> + <span class="variable">colorize</span>(<span class="string">'Invalid response status code.\n'</span>
587                         + <span class="string">'    Expected: [green]{'</span> + <span class="variable">status</span> + <span class="string">'}\n'</span>
588                         + <span class="string">'    Got: [red]{'</span> + <span class="variable">response</span>.<span class="variable">statusCode</span> + <span class="string">'}'</span>)
589                 );
590             }
591
592             <span class="comment">// Assert response headers</span>
593             <span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">headers</span>) {
594                 <span class="keyword">var</span> <span class="variable">keys</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">res</span>.<span class="variable">headers</span>);
595                 <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">keys</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
596                     <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">keys</span>[<span class="variable">i</span>],
597                         <span class="variable">actual</span> = <span class="variable">response</span>.<span class="variable">headers</span>[<span class="variable">name</span>.<span class="variable">toLowerCase</span>()],
598                         <span class="variable">expected</span> = <span class="variable">res</span>.<span class="variable">headers</span>[<span class="variable">name</span>],
599                         <span class="variable">eql</span> = <span class="variable">expected</span> <span class="variable">instanceof</span> <span class="class">RegExp</span>
600                           ? <span class="variable">expected</span>.<span class="variable">test</span>(<span class="variable">actual</span>)
601                           : <span class="variable">expected</span> == <span class="variable">actual</span>;
602                     <span class="variable">assert</span>.<span class="variable">ok</span>(
603                         <span class="variable">eql</span>,
604                         <span class="variable">msg</span> + <span class="variable">colorize</span>(<span class="string">'Invalid response header [bold]{'</span> + <span class="variable">name</span> + <span class="string">'}.\n'</span>
605                             + <span class="string">'    Expected: [green]{'</span> + <span class="variable">expected</span> + <span class="string">'}\n'</span>
606                             + <span class="string">'    Got: [red]{'</span> + <span class="variable">actual</span> + <span class="string">'}'</span>)
607                     );
608                 }
609             }
610
611             <span class="comment">// Callback</span>
612             <span class="variable">callback</span>(<span class="variable">response</span>);
613         });
614     });
615     <span class="variable">request</span>.<span class="variable">end</span>();
616 };</code></pre>
617 </td>
618 </tr>
619 <tr class="code">
620 <td class="docs">
621 <p>Pad the given string to the maximum width provided.</p>
622
623 <h2></h2>
624
625 <ul><li><p><strong>param</strong>: <em>String</em>  str</p></li><li><p><strong>param</strong>: <em>Number</em>  width</p></li><li><p><strong>return</strong>: <em>String</em> </p></li></ul>
626 </td>
627 <td class="code">
628 <pre><code><span class="keyword">function</span> <span class="variable">lpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
629     <span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
630     <span class="keyword">var</span> <span class="variable">n</span> = <span class="variable">width</span> - <span class="variable">str</span>.<span class="variable">length</span>;
631     <span class="keyword">if</span> (<span class="variable">n</span> &<span class="variable">lt</span>; <span class="number integer">1</span>) <span class="keyword">return</span> <span class="variable">str</span>;
632     <span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="string">' '</span> + <span class="variable">str</span>;
633     <span class="keyword">return</span> <span class="variable">str</span>;
634 }</code></pre>
635 </td>
636 </tr>
637 <tr class="code">
638 <td class="docs">
639 <p>Pad the given string to the maximum width provided.</p>
640
641 <h2></h2>
642
643 <ul><li><p><strong>param</strong>: <em>String</em>  str</p></li><li><p><strong>param</strong>: <em>Number</em>  width</p></li><li><p><strong>return</strong>: <em>String</em> </p></li></ul>
644 </td>
645 <td class="code">
646 <pre><code><span class="keyword">function</span> <span class="variable">rpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
647     <span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
648     <span class="keyword">var</span> <span class="variable">n</span> = <span class="variable">width</span> - <span class="variable">str</span>.<span class="variable">length</span>;
649     <span class="keyword">if</span> (<span class="variable">n</span> &<span class="variable">lt</span>; <span class="number integer">1</span>) <span class="keyword">return</span> <span class="variable">str</span>;
650     <span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="variable">str</span> + <span class="string">' '</span>;
651     <span class="keyword">return</span> <span class="variable">str</span>;
652 }</code></pre>
653 </td>
654 </tr>
655 <tr class="code">
656 <td class="docs">
657 <p>Report test coverage.</p>
658
659 <h2></h2>
660
661 <ul><li><p><strong>param</strong>: <em>Object</em>  cov</p></li></ul>
662 </td>
663 <td class="code">
664 <pre><code><span class="keyword">function</span> <span class="variable">reportCoverage</span>(<span class="variable">cov</span>) {
665     <span class="variable">populateCoverage</span>(<span class="variable">cov</span>);
666     <span class="comment">// Stats</span>
667     <span class="variable">print</span>(<span class="string">'\n   [bold]{Test Coverage}\n'</span>);
668     <span class="keyword">var</span> <span class="variable">sep</span> = <span class="string">'   +------------------------------------------+----------+------+------+--------+'</span>,
669         <span class="variable">lastSep</span> = <span class="string">'                                              +----------+------+------+--------+'</span>;
670     <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
671     <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="string">'   | filename                                 | coverage | LOC  | SLOC | missed |'</span>);
672     <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
673     <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">name</span> <span class="keyword">in</span> <span class="variable">cov</span>) {
674         <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
675         <span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
676             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'   | '</span> + <span class="variable">rpad</span>(<span class="variable">name</span>, <span class="number integer">40</span>));
677             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">file</span>.<span class="variable">coverage</span>.<span class="variable">toFixed</span>(<span class="number integer">2</span>), <span class="number integer">8</span>));
678             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">file</span>.<span class="class">LOC</span>, <span class="number integer">4</span>));
679             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">file</span>.<span class="class">SLOC</span>, <span class="number integer">4</span>));
680             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">file</span>.<span class="variable">totalMisses</span>, <span class="number integer">6</span>));
681             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
682         }
683     }
684     <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
685     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'     '</span> + <span class="variable">rpad</span>(<span class="string">''</span>, <span class="number integer">40</span>));
686     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">cov</span>.<span class="variable">coverage</span>.<span class="variable">toFixed</span>(<span class="number integer">2</span>), <span class="number integer">8</span>));
687     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">cov</span>.<span class="class">LOC</span>, <span class="number integer">4</span>));
688     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">cov</span>.<span class="class">SLOC</span>, <span class="number integer">4</span>));
689     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' | '</span> + <span class="variable">lpad</span>(<span class="variable">cov</span>.<span class="variable">totalMisses</span>, <span class="number integer">6</span>));
690     <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
691     <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">lastSep</span>);
692     <span class="comment">// Source</span>
693     <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">name</span> <span class="keyword">in</span> <span class="variable">cov</span>) {
694         <span class="keyword">if</span> (<span class="variable">name</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
695             <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
696             <span class="variable">print</span>(<span class="string">'\n   [bold]{'</span> + <span class="variable">name</span> + <span class="string">'}:'</span>);
697             <span class="variable">print</span>(<span class="variable">file</span>.<span class="variable">source</span>);
698             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\n'</span>);
699         }
700     }
701 }</code></pre>
702 </td>
703 </tr>
704 <tr class="code">
705 <td class="docs">
706 <p>Populate code coverage data.</p>
707
708 <h2></h2>
709
710 <ul><li><p><strong>param</strong>: <em>Object</em>  cov</p></li></ul>
711 </td>
712 <td class="code">
713 <pre><code><span class="keyword">function</span> <span class="variable">populateCoverage</span>(<span class="variable">cov</span>) {
714     <span class="variable">cov</span>.<span class="class">LOC</span> = 
715     <span class="variable">cov</span>.<span class="class">SLOC</span> =
716     <span class="variable">cov</span>.<span class="variable">totalFiles</span> =
717     <span class="variable">cov</span>.<span class="variable">totalHits</span> =
718     <span class="variable">cov</span>.<span class="variable">totalMisses</span> = 
719     <span class="variable">cov</span>.<span class="variable">coverage</span> = <span class="number integer">0</span>;
720     <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">name</span> <span class="keyword">in</span> <span class="variable">cov</span>) {
721         <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
722         <span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
723             <span class="comment">// Stats</span>
724             ++<span class="variable">cov</span>.<span class="variable">totalFiles</span>;
725             <span class="variable">cov</span>.<span class="variable">totalHits</span> += <span class="variable">file</span>.<span class="variable">totalHits</span> = <span class="variable">coverage</span>(<span class="variable">file</span>, <span class="variable">true</span>);
726             <span class="variable">cov</span>.<span class="variable">totalMisses</span> += <span class="variable">file</span>.<span class="variable">totalMisses</span> = <span class="variable">coverage</span>(<span class="variable">file</span>, <span class="variable">false</span>);
727             <span class="variable">file</span>.<span class="variable">totalLines</span> = <span class="variable">file</span>.<span class="variable">totalHits</span> + <span class="variable">file</span>.<span class="variable">totalMisses</span>;
728             <span class="variable">cov</span>.<span class="class">SLOC</span> += <span class="variable">file</span>.<span class="class">SLOC</span> = <span class="variable">file</span>.<span class="variable">totalLines</span>;
729             <span class="keyword">if</span> (!<span class="variable">file</span>.<span class="variable">source</span>) <span class="variable">file</span>.<span class="variable">source</span> = [];
730             <span class="variable">cov</span>.<span class="class">LOC</span> += <span class="variable">file</span>.<span class="class">LOC</span> = <span class="variable">file</span>.<span class="variable">source</span>.<span class="variable">length</span>;
731             <span class="variable">file</span>.<span class="variable">coverage</span> = (<span class="variable">file</span>.<span class="variable">totalHits</span> / <span class="variable">file</span>.<span class="variable">totalLines</span>) * <span class="number integer">100</span>;
732             <span class="comment">// Source</span>
733             <span class="keyword">var</span> <span class="variable">width</span> = <span class="variable">file</span>.<span class="variable">source</span>.<span class="variable">length</span>.<span class="variable">toString</span>().<span class="variable">length</span>;
734             <span class="variable">file</span>.<span class="variable">source</span> = <span class="variable">file</span>.<span class="variable">source</span>.<span class="variable">map</span>(<span class="keyword">function</span>(<span class="variable">line</span>, <span class="variable">i</span>){
735                 ++<span class="variable">i</span>;
736                 <span class="keyword">var</span> <span class="variable">hits</span> = <span class="variable">file</span>[<span class="variable">i</span>] === <span class="number integer">0</span> ? <span class="number integer">0</span> : (<span class="variable">file</span>[<span class="variable">i</span>] || <span class="string">' '</span>);
737                 <span class="keyword">if</span> (!<span class="variable">boring</span>) {
738                     <span class="keyword">if</span> (<span class="variable">hits</span> === <span class="number integer">0</span>) {
739                         <span class="variable">hits</span> = <span class="string">'\x1b[31m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
740                         <span class="variable">line</span> = <span class="string">'\x1b[41m'</span> + <span class="variable">line</span> + <span class="string">'\x1b[0m'</span>;
741                     } <span class="keyword">else</span> {
742                         <span class="variable">hits</span> = <span class="string">'\x1b[32m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
743                     }
744                 }
745                 <span class="keyword">return</span> <span class="string">'\n     '</span> + <span class="variable">lpad</span>(<span class="variable">i</span>, <span class="variable">width</span>) + <span class="string">' | '</span> + <span class="variable">hits</span> + <span class="string">' | '</span> + <span class="variable">line</span>;
746             }).<span class="variable">join</span>(<span class="string">''</span>);
747         }
748     }
749     <span class="variable">cov</span>.<span class="variable">coverage</span> = (<span class="variable">cov</span>.<span class="variable">totalHits</span> / <span class="variable">cov</span>.<span class="class">SLOC</span>) * <span class="number integer">100</span>;
750 }</code></pre>
751 </td>
752 </tr>
753 <tr class="code">
754 <td class="docs">
755 <p>Total coverage for the given file data.</p>
756
757 <h2></h2>
758
759 <ul><li><p><strong>param</strong>: <em>Array</em>  data</p></li><li><p><strong>return</strong>: <em>Type</em> </p></li></ul>
760 </td>
761 <td class="code">
762 <pre><code><span class="keyword">function</span> <span class="variable">coverage</span>(<span class="variable">data</span>, <span class="variable">val</span>) {
763     <span class="keyword">var</span> <span class="variable">n</span> = <span class="number integer">0</span>;
764     <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">data</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
765         <span class="keyword">if</span> (<span class="variable">data</span>[<span class="variable">i</span>] !== <span class="variable">undefined</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">data</span>[<span class="variable">i</span>] == <span class="variable">val</span>) ++<span class="variable">n</span>;
766     }
767     <span class="keyword">return</span> <span class="variable">n</span>;  
768 }</code></pre>
769 </td>
770 </tr>
771 <tr class="code">
772 <td class="docs">
773 <p>Run the given test <code>files</code>, or try <em>test/*</em>.</p>
774
775 <h2></h2>
776
777 <ul><li><p><strong>param</strong>: <em>Array</em>  files</p></li></ul>
778 </td>
779 <td class="code">
780 <pre><code><span class="keyword">function</span> <span class="variable">run</span>(<span class="variable">files</span>) {
781     <span class="keyword">if</span> (!<span class="variable">files</span>.<span class="variable">length</span>) {
782         <span class="keyword">try</span> {
783             <span class="variable">files</span> = <span class="variable">fs</span>.<span class="variable">readdirSync</span>(<span class="string">'test'</span>).<span class="variable">map</span>(<span class="keyword">function</span>(<span class="variable">file</span>){
784                 <span class="keyword">return</span> <span class="string">'test/'</span> + <span class="variable">file</span>;
785             });
786         } <span class="keyword">catch</span> (<span class="variable">err</span>) {
787             <span class="variable">print</span>(<span class="string">'\n  failed to load tests in [bold]{./test}\n'</span>);
788             ++<span class="variable">failures</span>;
789             <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
790         }
791     }
792     <span class="keyword">if</span> (<span class="variable">watch</span>) <span class="variable">watchFiles</span>(<span class="variable">files</span>);
793     <span class="variable">runFiles</span>(<span class="variable">files</span>);
794 }</code></pre>
795 </td>
796 </tr>
797 <tr class="code">
798 <td class="docs">
799 <p>Show the cursor when <code>show</code> is true, otherwise hide it.</p>
800
801 <h2></h2>
802
803 <ul><li><p><strong>param</strong>: <em>Boolean</em>  show</p></li></ul>
804 </td>
805 <td class="code">
806 <pre><code><span class="keyword">function</span> <span class="variable">cursor</span>(<span class="variable">show</span>) {
807     <span class="keyword">if</span> (<span class="variable">show</span>) {
808         <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25h'</span>);
809     } <span class="keyword">else</span> {
810         <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25l'</span>);
811     }
812 }</code></pre>
813 </td>
814 </tr>
815 <tr class="code">
816 <td class="docs">
817 <p>Run the given test <code>files</code>.</p>
818
819 <h2></h2>
820
821 <ul><li><p><strong>param</strong>: <em>Array</em>  files</p></li></ul>
822 </td>
823 <td class="code">
824 <pre><code><span class="keyword">function</span> <span class="variable">runFiles</span>(<span class="variable">files</span>) {
825     <span class="keyword">if</span> (<span class="variable">serial</span>) {
826         (<span class="keyword">function</span> <span class="variable">next</span>(){
827             <span class="keyword">if</span> (<span class="variable">files</span>.<span class="variable">length</span>) {
828                 <span class="variable">runFile</span>(<span class="variable">files</span>.<span class="variable">shift</span>(), <span class="variable">next</span>);
829             }
830         })();
831     } <span class="keyword">else</span> {
832       <span class="variable">files</span>.<span class="variable">forEach</span>(<span class="variable">runFile</span>);
833     }
834 }</code></pre>
835 </td>
836 </tr>
837 <tr class="code">
838 <td class="docs">
839 <p>Run tests for the given <code>file</code>, callback <code>fn()</code> when finished.</p>
840
841 <h2></h2>
842
843 <ul><li><p><strong>param</strong>: <em>String</em>  file</p></li><li><p><strong>param</strong>: <em>Function</em>  fn</p></li></ul>
844 </td>
845 <td class="code">
846 <pre><code><span class="keyword">function</span> <span class="variable">runFile</span>(<span class="variable">file</span>, <span class="variable">fn</span>) {
847     <span class="keyword">if</span> (<span class="variable">file</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
848         <span class="keyword">var</span> <span class="variable">title</span> = <span class="variable">path</span>.<span class="variable">basename</span>(<span class="variable">file</span>),
849             <span class="variable">file</span> = <span class="variable">path</span>.<span class="variable">join</span>(<span class="variable">cwd</span>, <span class="variable">file</span>),
850             <span class="variable">mod</span> = <span class="variable">require</span>(<span class="variable">file</span>.<span class="variable">replace</span>(<span class="regexp">/\.js$/</span>, <span class="string">''</span>));
851         (<span class="keyword">function</span> <span class="variable">check</span>(){
852            <span class="keyword">var</span> <span class="variable">len</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">mod</span>).<span class="variable">length</span>;
853            <span class="keyword">if</span> (<span class="variable">len</span>) {
854                <span class="variable">runSuite</span>(<span class="variable">title</span>, <span class="variable">mod</span>, <span class="variable">fn</span>);
855            } <span class="keyword">else</span> {
856                <span class="variable">setTimeout</span>(<span class="variable">check</span>, <span class="number integer">20</span>);
857            }
858         })();
859     }
860 }</code></pre>
861 </td>
862 </tr>
863 <tr class="code">
864 <td class="docs">
865 <p>Clear the module cache for the given <code>file</code>.</p>
866
867 <h2></h2>
868
869 <ul><li><p><strong>param</strong>: <em>String</em>  file</p></li></ul>
870 </td>
871 <td class="code">
872 <pre><code><span class="keyword">function</span> <span class="variable">clearCache</span>(<span class="variable">file</span>) {
873     <span class="keyword">var</span> <span class="variable">keys</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">module</span>.<span class="variable">moduleCache</span>);
874     <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">keys</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
875         <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">keys</span>[<span class="variable">i</span>];
876         <span class="keyword">if</span> (<span class="variable">key</span>.<span class="variable">indexOf</span>(<span class="variable">file</span>) === <span class="variable">key</span>.<span class="variable">length</span> - <span class="variable">file</span>.<span class="variable">length</span>) {
877             <span class="keyword">delete</span> <span class="variable">module</span>.<span class="variable">moduleCache</span>[<span class="variable">key</span>];
878         }
879     }
880 }</code></pre>
881 </td>
882 </tr>
883 <tr class="code">
884 <td class="docs">
885 <p>Watch the given <code>files</code> for changes.</p>
886
887 <h2></h2>
888
889 <ul><li><p><strong>param</strong>: <em>Array</em>  files</p></li></ul>
890 </td>
891 <td class="code">
892 <pre><code><span class="keyword">function</span> <span class="variable">watchFiles</span>(<span class="variable">files</span>) {
893     <span class="keyword">var</span> <span class="variable">p</span> = <span class="number integer">0</span>,
894         <span class="variable">c</span> = [<span class="string">'â–«   '</span>, <span class="string">'â–«â–«  '</span>, <span class="string">'â–«â–«â–« '</span>, <span class="string">' â–«â–«â–«'</span>,
895              <span class="string">'  â–«â–«'</span>, <span class="string">'   â–«'</span>, <span class="string">'   â–«'</span>, <span class="string">'  â–«â–«'</span>,
896              <span class="string">'â–«â–«â–« '</span>, <span class="string">'â–«â–«  '</span>, <span class="string">'â–«   '</span>],
897         <span class="variable">l</span> = <span class="variable">c</span>.<span class="variable">length</span>;
898     <span class="variable">cursor</span>(<span class="variable">false</span>);
899     <span class="variable">setInterval</span>(<span class="keyword">function</span>(){
900         <span class="variable">sys</span>.<span class="variable">print</span>(<span class="variable">colorize</span>(<span class="string">'  [green]{'</span> + <span class="variable">c</span>[<span class="variable">p</span>++ % <span class="variable">l</span>] + <span class="string">'} watching\r'</span>));
901     }, <span class="number integer">100</span>);
902     <span class="variable">files</span>.<span class="variable">forEach</span>(<span class="keyword">function</span>(<span class="variable">file</span>){
903         <span class="variable">fs</span>.<span class="variable">watchFile</span>(<span class="variable">file</span>, { <span class="variable">interval</span>: <span class="number integer">100</span> }, <span class="keyword">function</span>(<span class="variable">curr</span>, <span class="variable">prev</span>){
904             <span class="keyword">if</span> (<span class="variable">curr</span>.<span class="variable">mtime</span> &<span class="variable">gt</span>; <span class="variable">prev</span>.<span class="variable">mtime</span>) {
905                 <span class="variable">print</span>(<span class="string">'  [yellow]{â—¦} '</span> + <span class="variable">file</span>);
906                 <span class="variable">clearCache</span>(<span class="variable">file</span>);
907                 <span class="variable">runFile</span>(<span class="variable">file</span>);
908             }
909         });
910     });
911 }</code></pre>
912 </td>
913 </tr>
914 <tr class="code">
915 <td class="docs">
916 <p>Report <code>err</code> for the given <code>test</code> and <code>suite</code>.</p>
917
918 <h2></h2>
919
920 <ul><li><p><strong>param</strong>: <em>String</em>  suite</p></li><li><p><strong>param</strong>: <em>String</em>  test</p></li><li><p><strong>param</strong>: <em>Error</em>  err</p></li></ul>
921 </td>
922 <td class="code">
923 <pre><code><span class="keyword">function</span> <span class="variable">error</span>(<span class="variable">suite</span>, <span class="variable">test</span>, <span class="variable">err</span>) {
924     ++<span class="variable">failures</span>;
925     <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">err</span>.<span class="variable">name</span>,
926         <span class="variable">stack</span> = <span class="variable">err</span>.<span class="variable">stack</span>.<span class="variable">replace</span>(<span class="variable">err</span>.<span class="variable">name</span>, <span class="string">''</span>),
927         <span class="keyword">label</span> = <span class="variable">test</span> === <span class="string">'uncaught'</span>
928             ? <span class="variable">test</span>
929             : <span class="variable">suite</span> + <span class="string">' '</span> + <span class="variable">test</span>;
930     <span class="variable">print</span>(<span class="string">'\n   [bold]{'</span> + <span class="keyword">label</span> + <span class="string">'}: [red]{'</span> + <span class="variable">name</span> + <span class="string">'}'</span> + <span class="variable">stack</span> + <span class="string">'\n'</span>);
931     <span class="keyword">if</span> (<span class="variable">watch</span>) <span class="variable">notify</span>(<span class="keyword">label</span> + <span class="string">' failed'</span>);
932 }</code></pre>
933 </td>
934 </tr>
935 <tr class="code">
936 <td class="docs">
937 <p>Run the given tests, callback <code>fn()</code> when finished.</p>
938
939 <h2></h2>
940
941 <ul><li><p><strong>param</strong>: <em>String</em>  title</p></li><li><p><strong>param</strong>: <em>Object</em>  tests</p></li><li><p><strong>param</strong>: <em>Function</em>  fn</p></li></ul>
942 </td>
943 <td class="code">
944 <pre><code><span class="keyword">var</span> <span class="variable">dots</span> = <span class="number integer">0</span>;
945 <span class="keyword">function</span> <span class="variable">runSuite</span>(<span class="variable">title</span>, <span class="variable">tests</span>, <span class="variable">fn</span>) {
946     <span class="comment">// Keys</span>
947     <span class="keyword">var</span> <span class="variable">keys</span> = <span class="variable">only</span>.<span class="variable">length</span>
948         ? <span class="variable">only</span>.<span class="variable">slice</span>(<span class="number integer">0</span>)
949         : <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">tests</span>);
950
951     <span class="comment">// Setup</span>
952     <span class="keyword">var</span> <span class="variable">setup</span> = <span class="variable">tests</span>.<span class="variable">setup</span> || <span class="keyword">function</span>(<span class="variable">fn</span>){ <span class="variable">fn</span>(); };
953
954     <span class="comment">// Iterate tests</span>
955     (<span class="keyword">function</span> <span class="variable">next</span>(){
956         <span class="keyword">if</span> (<span class="variable">keys</span>.<span class="variable">length</span>) {
957             <span class="keyword">var</span> <span class="variable">key</span>,
958                 <span class="variable">test</span> = <span class="variable">tests</span>[<span class="variable">key</span> = <span class="variable">keys</span>.<span class="variable">shift</span>()];
959             <span class="comment">// Non-tests</span>
960             <span class="keyword">if</span> (<span class="variable">key</span> === <span class="string">'setup'</span>) <span class="keyword">return</span> <span class="variable">next</span>();
961
962             <span class="comment">// Run test</span>
963             <span class="keyword">if</span> (<span class="variable">test</span>) {
964                 <span class="keyword">try</span> {
965                     ++<span class="variable">testcount</span>;
966                     <span class="variable">assert</span>.<span class="variable">testTitle</span> = <span class="variable">key</span>;
967                     <span class="keyword">if</span> (<span class="variable">serial</span>) {
968                         <span class="keyword">if</span> (!<span class="variable">watch</span>) {
969                             <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'.'</span>);
970                             <span class="keyword">if</span> (++<span class="variable">dots</span> % <span class="number integer">25</span> === <span class="number integer">0</span>) <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\n'</span>);
971                         }
972                         <span class="variable">setup</span>(<span class="keyword">function</span>(){
973                             <span class="keyword">if</span> (<span class="variable">test</span>.<span class="variable">length</span> &<span class="variable">lt</span>; <span class="number integer">1</span>) {
974                                 <span class="variable">test</span>();
975                                 <span class="variable">next</span>();
976                             } <span class="keyword">else</span> {
977                                 <span class="keyword">var</span> <span class="variable">id</span> = <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){
978                                     <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(&<span class="variable">quot</span>;<span class="string">'&quot; + key + &quot;'</span> <span class="variable">timed</span> <span class="variable">out</span>&<span class="variable">quot</span>;);
979                                 }, <span class="variable">timeout</span>);
980                                 <span class="variable">test</span>(<span class="keyword">function</span>(){
981                                     <span class="variable">clearTimeout</span>(<span class="variable">id</span>);
982                                     <span class="variable">next</span>();
983                                 });
984                             } 
985                         });
986                     } <span class="keyword">else</span> {
987                         <span class="variable">test</span>(<span class="keyword">function</span>(<span class="variable">fn</span>){
988                             <span class="variable">process</span>.<span class="variable">addListener</span>(<span class="string">'beforeExit'</span>, <span class="keyword">function</span>(){
989                                 <span class="keyword">try</span> {
990                                     <span class="variable">fn</span>();
991                                 } <span class="keyword">catch</span> (<span class="variable">err</span>) {
992                                     <span class="variable">error</span>(<span class="variable">title</span>, <span class="variable">key</span>, <span class="variable">err</span>);
993                                 }
994                             });
995                         });
996                     }
997                 } <span class="keyword">catch</span> (<span class="variable">err</span>) {
998                     <span class="variable">error</span>(<span class="variable">title</span>, <span class="variable">key</span>, <span class="variable">err</span>);
999                 }
1000             }
1001             <span class="keyword">if</span> (!<span class="variable">serial</span>) <span class="variable">next</span>();
1002         } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">serial</span>) {
1003           <span class="variable">fn</span>();
1004         }
1005     })();
1006 }</code></pre>
1007 </td>
1008 </tr>
1009 <tr class="code">
1010 <td class="docs">
1011 <p>Report exceptions.
1012  </p>
1013 </td>
1014 <td class="code">
1015 <pre><code><span class="keyword">function</span> <span class="variable">report</span>() {
1016     <span class="variable">process</span>.<span class="variable">emit</span>(<span class="string">'beforeExit'</span>);
1017     <span class="keyword">if</span> (<span class="variable">failures</span>) {
1018         <span class="variable">print</span>(<span class="string">'\n   [bold]{Failures}: [red]{'</span> + <span class="variable">failures</span> + <span class="string">'}\n\n'</span>);
1019         <span class="variable">notify</span>(<span class="string">'Failures: '</span> + <span class="variable">failures</span>);
1020     } <span class="keyword">else</span> {
1021         <span class="keyword">if</span> (<span class="variable">serial</span>) <span class="variable">print</span>(<span class="string">''</span>);
1022         <span class="variable">print</span>(<span class="string">'\n   [green]{100%} '</span> + <span class="variable">testcount</span> + <span class="string">' tests\n'</span>);
1023         <span class="variable">notify</span>(<span class="string">'100% ok'</span>);
1024     }
1025     <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">_</span>$<span class="variable">jscoverage</span> === <span class="string">'object'</span>) {
1026         <span class="variable">reportCoverage</span>(<span class="variable">_</span>$<span class="variable">jscoverage</span>);
1027     }
1028 }</code></pre>
1029 </td>
1030 </tr>
1031 <tr class="code">
1032 <td class="docs">
1033 <p>Growl notify the given <code>msg</code>.</p>
1034
1035 <h2></h2>
1036
1037 <ul><li><p><strong>param</strong>: <em>String</em>  msg</p></li></ul>
1038 </td>
1039 <td class="code">
1040 <pre><code><span class="keyword">function</span> <span class="variable">notify</span>(<span class="variable">msg</span>) {
1041     <span class="keyword">if</span> (<span class="variable">growl</span>) {
1042         <span class="variable">childProcess</span>.<span class="variable">exec</span>(<span class="string">'growlnotify -name Expresso -m &quot;'</span> + <span class="variable">msg</span> + <span class="string">'&quot;'</span>);
1043     }
1044 }
1045
1046 <span class="comment">// Report uncaught exceptions</span>
1047
1048 <span class="variable">process</span>.<span class="variable">addListener</span>(<span class="string">'uncaughtException'</span>, <span class="keyword">function</span>(<span class="variable">err</span>){
1049     <span class="variable">error</span>(<span class="string">'uncaught'</span>, <span class="string">'uncaught'</span>, <span class="variable">err</span>);
1050 });
1051
1052 <span class="comment">// Show cursor</span>
1053
1054 [<span class="string">'INT'</span>, <span class="string">'TERM'</span>, <span class="string">'QUIT'</span>].<span class="variable">forEach</span>(<span class="keyword">function</span>(<span class="variable">sig</span>){
1055     <span class="variable">process</span>.<span class="variable">addListener</span>(<span class="string">'SIG'</span> + <span class="variable">sig</span>, <span class="keyword">function</span>(){
1056         <span class="variable">cursor</span>(<span class="variable">true</span>);
1057         <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
1058     });
1059 });
1060
1061 <span class="comment">// Report test coverage when available</span>
1062 <span class="comment">// and emit &quot;beforeExit&quot; event to perform</span>
1063 <span class="comment">// final assertions</span>
1064
1065 <span class="keyword">var</span> <span class="variable">orig</span> = <span class="variable">process</span>.<span class="variable">emit</span>;
1066 <span class="variable">process</span>.<span class="variable">emit</span> = <span class="keyword">function</span>(<span class="variable">event</span>){
1067     <span class="keyword">if</span> (<span class="variable">event</span> === <span class="string">'exit'</span>) {
1068         <span class="variable">report</span>();
1069         <span class="variable">process</span>.<span class="variable">reallyExit</span>(<span class="variable">failures</span>);
1070     }
1071     <span class="variable">orig</span>.<span class="variable">apply</span>(<span class="this">this</span>, <span class="variable">arguments</span>);
1072 };
1073
1074 <span class="comment">// Run test files</span>
1075
1076 <span class="keyword">if</span> (!<span class="variable">defer</span>) <span class="variable">run</span>(<span class="variable">files</span>);
1077 </code></pre>
1078 </td>
1079 </tr>   </body>
1080 </html></tbody></table>