PageRenderTime 64ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/js/lib/Socket.IO-node/support/expresso/docs/api.html

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs
HTML | 946 lines | 880 code | 66 blank | 0 comment | 0 complexity | ba30517e78cbc91e7d05663219349257 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  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="api.html#">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. <span class="comment">// Parse arguments</span>
  253. <span class="keyword">var</span> <span class="variable">files</span> = [],
  254. <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>);
  255. <span class="keyword">while</span> (<span class="variable">args</span>.<span class="variable">length</span>) {
  256. <span class="keyword">var</span> <span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>();
  257. <span class="keyword">switch</span> (<span class="variable">arg</span>) {
  258. <span class="keyword">case</span> <span class="string">'-h'</span>:
  259. <span class="keyword">case</span> <span class="string">'--help'</span>:
  260. <span class="variable">print</span>(<span class="variable">usage</span> + <span class="string">'\n'</span>);
  261. <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
  262. <span class="keyword">break</span>;
  263. <span class="keyword">case</span> <span class="string">'-v'</span>:
  264. <span class="keyword">case</span> <span class="string">'--version'</span>:
  265. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">version</span>);
  266. <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
  267. <span class="keyword">break</span>;
  268. <span class="keyword">case</span> <span class="string">'-i'</span>:
  269. <span class="keyword">case</span> <span class="string">'-I'</span>:
  270. <span class="keyword">case</span> <span class="string">'--include'</span>:
  271. <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
  272. <span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="variable">arg</span>);
  273. } <span class="keyword">else</span> {
  274. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--include requires a path'</span>);
  275. }
  276. <span class="keyword">break</span>;
  277. <span class="keyword">case</span> <span class="string">'-o'</span>:
  278. <span class="keyword">case</span> <span class="string">'--only'</span>:
  279. <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
  280. <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>));
  281. } <span class="keyword">else</span> {
  282. <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>);
  283. }
  284. <span class="keyword">break</span>;
  285. <span class="keyword">case</span> <span class="string">'-p'</span>:
  286. <span class="keyword">case</span> <span class="string">'--port'</span>:
  287. <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
  288. <span class="variable">port</span> = <span class="variable">parseInt</span>(<span class="variable">arg</span>, <span class="number integer">10</span>);
  289. } <span class="keyword">else</span> {
  290. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--port requires a number'</span>);
  291. }
  292. <span class="keyword">break</span>;
  293. <span class="keyword">case</span> <span class="string">'-r'</span>:
  294. <span class="keyword">case</span> <span class="string">'--require'</span>:
  295. <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
  296. <span class="variable">require</span>(<span class="variable">arg</span>);
  297. } <span class="keyword">else</span> {
  298. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--require requires a path'</span>);
  299. }
  300. <span class="keyword">break</span>;
  301. <span class="keyword">case</span> <span class="string">'-t'</span>:
  302. <span class="keyword">case</span> <span class="string">'--timeout'</span>:
  303. <span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
  304. <span class="variable">timeout</span> = <span class="variable">parseInt</span>(<span class="variable">arg</span>, <span class="number integer">10</span>);
  305. } <span class="keyword">else</span> {
  306. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--timeout requires an argument'</span>);
  307. }
  308. <span class="keyword">break</span>;
  309. <span class="keyword">case</span> <span class="string">'-c'</span>:
  310. <span class="keyword">case</span> <span class="string">'--cov'</span>:
  311. <span class="keyword">case</span> <span class="string">'--coverage'</span>:
  312. <span class="variable">defer</span> = <span class="variable">true</span>;
  313. <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>){
  314. <span class="keyword">if</span> (<span class="variable">err</span>) <span class="keyword">throw</span> <span class="variable">err</span>;
  315. <span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="string">'lib-cov'</span>);
  316. <span class="variable">run</span>(<span class="variable">files</span>);
  317. })
  318. <span class="keyword">break</span>;
  319. <span class="keyword">case</span> <span class="string">'-b'</span>:
  320. <span class="keyword">case</span> <span class="string">'--boring'</span>:
  321. <span class="variable">boring</span> = <span class="variable">true</span>;
  322. <span class="keyword">break</span>;
  323. <span class="keyword">case</span> <span class="string">'-w'</span>:
  324. <span class="keyword">case</span> <span class="string">'--watch'</span>:
  325. <span class="variable">watch</span> = <span class="variable">true</span>;
  326. <span class="keyword">break</span>;
  327. <span class="keyword">case</span> <span class="string">'-g'</span>:
  328. <span class="keyword">case</span> <span class="string">'--growl'</span>:
  329. <span class="variable">growl</span> = <span class="variable">true</span>;
  330. <span class="keyword">break</span>;
  331. <span class="keyword">case</span> <span class="string">'-s'</span>:
  332. <span class="keyword">case</span> <span class="string">'--serial'</span>:
  333. <span class="variable">serial</span> = <span class="variable">true</span>;
  334. <span class="keyword">break</span>;
  335. <span class="keyword">default</span>:
  336. <span class="keyword">if</span> (<span class="regexp">/\.js$/</span>.<span class="variable">test</span>(<span class="variable">arg</span>)) {
  337. <span class="variable">files</span>.<span class="variable">push</span>(<span class="variable">arg</span>);
  338. }
  339. <span class="keyword">break</span>;
  340. }
  341. }</code></pre>
  342. </td>
  343. </tr>
  344. <tr class="code">
  345. <td class="docs">
  346. <p>Colorized sys.error().</p>
  347. <h2></h2>
  348. <ul><li><p><strong>param</strong>: <em>String</em> str</p></li></ul>
  349. </td>
  350. <td class="code">
  351. <pre><code><span class="keyword">function</span> <span class="variable">print</span>(<span class="variable">str</span>){
  352. <span class="variable">sys</span>.<span class="variable">error</span>(<span class="variable">colorize</span>(<span class="variable">str</span>));
  353. }</code></pre>
  354. </td>
  355. </tr>
  356. <tr class="code">
  357. <td class="docs">
  358. <p>Colorize the given string using ansi-escape sequences.
  359. Disabled when --boring is set.</p>
  360. <h2></h2>
  361. <ul><li><p><strong>param</strong>: <em>String</em> str</p></li><li><p><strong>return</strong>: <em>String</em> </p></li></ul>
  362. </td>
  363. <td class="code">
  364. <pre><code><span class="keyword">function</span> <span class="variable">colorize</span>(<span class="variable">str</span>){
  365. <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> };
  366. <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>){
  367. <span class="keyword">return</span> <span class="variable">boring</span>
  368. ? <span class="variable">str</span>
  369. : <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>;
  370. });
  371. }
  372. <span class="comment">// Alias deepEqual as eql for complex equality</span>
  373. <span class="variable">assert</span>.<span class="variable">eql</span> = <span class="variable">assert</span>.<span class="variable">deepEqual</span>;</code></pre>
  374. </td>
  375. </tr>
  376. <tr class="code">
  377. <td class="docs">
  378. <p>Assert that <code>val</code> is null.</p>
  379. <h2></h2>
  380. <ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
  381. </td>
  382. <td class="code">
  383. <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>) {
  384. <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>);
  385. };</code></pre>
  386. </td>
  387. </tr>
  388. <tr class="code">
  389. <td class="docs">
  390. <p>Assert that <code>val</code> is not null.</p>
  391. <h2></h2>
  392. <ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
  393. </td>
  394. <td class="code">
  395. <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>) {
  396. <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>);
  397. };</code></pre>
  398. </td>
  399. </tr>
  400. <tr class="code">
  401. <td class="docs">
  402. <p>Assert that <code>val</code> is undefined.</p>
  403. <h2></h2>
  404. <ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
  405. </td>
  406. <td class="code">
  407. <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>) {
  408. <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>);
  409. };</code></pre>
  410. </td>
  411. </tr>
  412. <tr class="code">
  413. <td class="docs">
  414. <p>Assert that <code>val</code> is not undefined.</p>
  415. <h2></h2>
  416. <ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
  417. </td>
  418. <td class="code">
  419. <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>) {
  420. <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>);
  421. };</code></pre>
  422. </td>
  423. </tr>
  424. <tr class="code">
  425. <td class="docs">
  426. <p>Assert that <code>obj</code> is <code>type</code>.</p>
  427. <h2></h2>
  428. <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>
  429. </td>
  430. <td class="code">
  431. <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>){
  432. <span class="keyword">var</span> <span class="variable">real</span> = <span class="keyword">typeof</span> <span class="variable">obj</span>;
  433. <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>;
  434. <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>);
  435. };</code></pre>
  436. </td>
  437. </tr>
  438. <tr class="code">
  439. <td class="docs">
  440. <p>Assert that <code>str</code> matches <code>regexp</code>.</p>
  441. <h2></h2>
  442. <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>
  443. </td>
  444. <td class="code">
  445. <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>) {
  446. <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>);
  447. <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>);
  448. };</code></pre>
  449. </td>
  450. </tr>
  451. <tr class="code">
  452. <td class="docs">
  453. <p>Assert that <code>val</code> is within <code>obj</code>.</p>
  454. <h2>Examples</h2>
  455. <p> assert.includes('foobar', 'bar');
  456. assert.includes(['foo', 'bar'], 'foo');</p>
  457. <h2></h2>
  458. <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>
  459. </td>
  460. <td class="code">
  461. <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>) {
  462. <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>);
  463. <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>);
  464. };</code></pre>
  465. </td>
  466. </tr>
  467. <tr class="code">
  468. <td class="docs">
  469. <p>Assert length of <code>val</code> is <code>n</code>.</p>
  470. <h2></h2>
  471. <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>
  472. </td>
  473. <td class="code">
  474. <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>) {
  475. <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>;
  476. <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>);
  477. };</code></pre>
  478. </td>
  479. </tr>
  480. <tr class="code">
  481. <td class="docs">
  482. <p>Assert response from <code>server</code> with
  483. the given <code>req</code> object and <code>res</code> assertions object.</p>
  484. <h2></h2>
  485. <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>
  486. </td>
  487. <td class="code">
  488. <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>){
  489. <span class="comment">// Callback as third or fourth arg</span>
  490. <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>
  491. ? <span class="variable">res</span>
  492. : <span class="keyword">typeof</span> <span class="variable">msg</span> === <span class="string">'function'</span>
  493. ? <span class="variable">msg</span>
  494. : <span class="keyword">function</span>(){};
  495. <span class="comment">// Default messate to test title</span>
  496. <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>;
  497. <span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">assert</span>.<span class="variable">testTitle</span>;
  498. <span class="variable">msg</span> += <span class="string">'. '</span>;
  499. <span class="comment">// Pending responses</span>
  500. <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>;
  501. <span class="variable">server</span>.<span class="variable">__pending</span>++;
  502. <span class="comment">// Create client</span>
  503. <span class="keyword">if</span> (!<span class="variable">server</span>.<span class="variable">fd</span>) {
  504. <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>);
  505. <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>);
  506. }
  507. <span class="comment">// Issue request</span>
  508. <span class="keyword">var</span> <span class="variable">timer</span>,
  509. <span class="variable">client</span> = <span class="variable">server</span>.<span class="variable">client</span>,
  510. <span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">method</span> || <span class="string">'GET'</span>,
  511. <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>,
  512. <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>,
  513. <span class="variable">requestTimeout</span> = <span class="variable">req</span>.<span class="variable">timeout</span> || <span class="number integer">0</span>;
  514. <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>);
  515. <span class="comment">// Timeout</span>
  516. <span class="keyword">if</span> (<span class="variable">requestTimeout</span>) {
  517. <span class="variable">timer</span> = <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){
  518. --<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
  519. <span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">timeout</span>;
  520. <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>);
  521. }, <span class="variable">requestTimeout</span>);
  522. }
  523. <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>);
  524. <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>){
  525. <span class="variable">response</span>.<span class="variable">body</span> = <span class="string">''</span>;
  526. <span class="variable">response</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>);
  527. <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>; });
  528. <span class="variable">response</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>(){
  529. --<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
  530. <span class="keyword">if</span> (<span class="variable">timer</span>) <span class="variable">clearTimeout</span>(<span class="variable">timer</span>);
  531. <span class="comment">// Assert response body</span>
  532. <span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">body</span> !== <span class="variable">undefined</span>) {
  533. <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>
  534. ? <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>)
  535. : <span class="variable">res</span>.<span class="variable">body</span> === <span class="variable">response</span>.<span class="variable">body</span>;
  536. <span class="variable">assert</span>.<span class="variable">ok</span>(
  537. <span class="variable">eql</span>,
  538. <span class="variable">msg</span> + <span class="string">'Invalid response body.\n'</span>
  539. + <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>
  540. + <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>)
  541. );
  542. }
  543. <span class="comment">// Assert response status</span>
  544. <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">status</span> === <span class="string">'number'</span>) {
  545. <span class="variable">assert</span>.<span class="variable">equal</span>(
  546. <span class="variable">response</span>.<span class="variable">statusCode</span>,
  547. <span class="variable">status</span>,
  548. <span class="variable">msg</span> + <span class="variable">colorize</span>(<span class="string">'Invalid response status code.\n'</span>
  549. + <span class="string">' Expected: [green]{'</span> + <span class="variable">status</span> + <span class="string">'}\n'</span>
  550. + <span class="string">' Got: [red]{'</span> + <span class="variable">response</span>.<span class="variable">statusCode</span> + <span class="string">'}'</span>)
  551. );
  552. }
  553. <span class="comment">// Assert response headers</span>
  554. <span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">headers</span>) {
  555. <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>);
  556. <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>) {
  557. <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">keys</span>[<span class="variable">i</span>],
  558. <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>()],
  559. <span class="variable">expected</span> = <span class="variable">res</span>.<span class="variable">headers</span>[<span class="variable">name</span>],
  560. <span class="variable">eql</span> = <span class="variable">expected</span> <span class="variable">instanceof</span> <span class="class">RegExp</span>
  561. ? <span class="variable">expected</span>.<span class="variable">test</span>(<span class="variable">actual</span>)
  562. : <span class="variable">expected</span> == <span class="variable">actual</span>;
  563. <span class="variable">assert</span>.<span class="variable">ok</span>(
  564. <span class="variable">eql</span>,
  565. <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>
  566. + <span class="string">' Expected: [green]{'</span> + <span class="variable">expected</span> + <span class="string">'}\n'</span>
  567. + <span class="string">' Got: [red]{'</span> + <span class="variable">actual</span> + <span class="string">'}'</span>)
  568. );
  569. }
  570. }
  571. <span class="comment">// Callback</span>
  572. <span class="variable">callback</span>(<span class="variable">response</span>);
  573. });
  574. });
  575. <span class="variable">request</span>.<span class="variable">end</span>();
  576. };</code></pre>
  577. </td>
  578. </tr>
  579. <tr class="code">
  580. <td class="docs">
  581. <p>Pad the given string to the maximum width provided.</p>
  582. <h2></h2>
  583. <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>
  584. </td>
  585. <td class="code">
  586. <pre><code><span class="keyword">function</span> <span class="variable">lpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
  587. <span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
  588. <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>;
  589. <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>;
  590. <span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="string">' '</span> + <span class="variable">str</span>;
  591. <span class="keyword">return</span> <span class="variable">str</span>;
  592. }</code></pre>
  593. </td>
  594. </tr>
  595. <tr class="code">
  596. <td class="docs">
  597. <p>Pad the given string to the maximum width provided.</p>
  598. <h2></h2>
  599. <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>
  600. </td>
  601. <td class="code">
  602. <pre><code><span class="keyword">function</span> <span class="variable">rpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
  603. <span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
  604. <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>;
  605. <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>;
  606. <span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="variable">str</span> + <span class="string">' '</span>;
  607. <span class="keyword">return</span> <span class="variable">str</span>;
  608. }</code></pre>
  609. </td>
  610. </tr>
  611. <tr class="code">
  612. <td class="docs">
  613. <p>Report test coverage.</p>
  614. <h2></h2>
  615. <ul><li><p><strong>param</strong>: <em>Object</em> cov</p></li></ul>
  616. </td>
  617. <td class="code">
  618. <pre><code><span class="keyword">function</span> <span class="variable">reportCoverage</span>(<span class="variable">cov</span>) {
  619. <span class="variable">populateCoverage</span>(<span class="variable">cov</span>);
  620. <span class="comment">// Stats</span>
  621. <span class="variable">print</span>(<span class="string">'\n [bold]{Test Coverage}\n'</span>);
  622. <span class="keyword">var</span> <span class="variable">sep</span> = <span class="string">' +------------------------------------------+----------+------+------+--------+'</span>,
  623. <span class="variable">lastSep</span> = <span class="string">' +----------+------+------+--------+'</span>;
  624. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
  625. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="string">' | filename | coverage | LOC | SLOC | missed |'</span>);
  626. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
  627. <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>) {
  628. <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
  629. <span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
  630. <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>));
  631. <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>));
  632. <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>));
  633. <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>));
  634. <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>));
  635. <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
  636. }
  637. }
  638. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
  639. <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>));
  640. <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>));
  641. <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>));
  642. <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>));
  643. <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>));
  644. <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
  645. <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">lastSep</span>);
  646. <span class="comment">// Source</span>
  647. <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>) {
  648. <span class="keyword">if</span> (<span class="variable">name</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
  649. <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
  650. <span class="variable">print</span>(<span class="string">'\n [bold]{'</span> + <span class="variable">name</span> + <span class="string">'}:'</span>);
  651. <span class="variable">print</span>(<span class="variable">file</span>.<span class="variable">source</span>);
  652. <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\n'</span>);
  653. }
  654. }
  655. }</code></pre>
  656. </td>
  657. </tr>
  658. <tr class="code">
  659. <td class="docs">
  660. <p>Populate code coverage data.</p>
  661. <h2></h2>
  662. <ul><li><p><strong>param</strong>: <em>Object</em> cov</p></li></ul>
  663. </td>
  664. <td class="code">
  665. <pre><code><span class="keyword">function</span> <span class="variable">populateCoverage</span>(<span class="variable">cov</span>) {
  666. <span class="variable">cov</span>.<span class="class">LOC</span> =
  667. <span class="variable">cov</span>.<span class="class">SLOC</span> =
  668. <span class="variable">cov</span>.<span class="variable">totalFiles</span> =
  669. <span class="variable">cov</span>.<span class="variable">totalHits</span> =
  670. <span class="variable">cov</span>.<span class="variable">totalMisses</span> =
  671. <span class="variable">cov</span>.<span class="variable">coverage</span> = <span class="number integer">0</span>;
  672. <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>) {
  673. <span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
  674. <span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
  675. <span class="comment">// Stats</span>
  676. ++<span class="variable">cov</span>.<span class="variable">totalFiles</span>;
  677. <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>);
  678. <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>);
  679. <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>;
  680. <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>;
  681. <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> = [];
  682. <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>;
  683. <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>;
  684. <span class="comment">// Source</span>
  685. <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>;
  686. <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>){
  687. ++<span class="variable">i</span>;
  688. <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>);
  689. <span class="keyword">if</span> (!<span class="variable">boring</span>) {
  690. <span class="keyword">if</span> (<span class="variable">hits</span> === <span class="number integer">0</span>) {
  691. <span class="variable">hits</span> = <span class="string">'\x1b[31m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
  692. <span class="variable">line</span> = <span class="string">'\x1b[41m'</span> + <span class="variable">line</span> + <span class="string">'\x1b[0m'</span>;
  693. } <span class="keyword">else</span> {
  694. <span class="variable">hits</span> = <span class="string">'\x1b[32m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
  695. }
  696. }
  697. <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>;
  698. }).<span class="variable">join</span>(<span class="string">''</span>);
  699. }
  700. }
  701. <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>;
  702. }</code></pre>
  703. </td>
  704. </tr>
  705. <tr class="code">
  706. <td class="docs">
  707. <p>Total coverage for the given file data.</p>
  708. <h2></h2>
  709. <ul><li><p><strong>param</strong>: <em>Array</em> data</p></li><li><p><strong>return</strong>: <em>Type</em> </p></li></ul>
  710. </td>
  711. <td class="code">
  712. <pre><code><span class="keyword">function</span> <span class="variable">coverage</span>(<span class="variable">data</span>, <span class="variable">val</span>) {
  713. <span class="keyword">var</span> <span class="variable">n</span> = <span class="number integer">0</span>;
  714. <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>) {
  715. <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>;
  716. }
  717. <span class="keyword">return</span> <span class="variable">n</span>;
  718. }</code></pre>
  719. </td>
  720. </tr>
  721. <tr class="code">
  722. <td class="docs">
  723. <p>Run the given test <code>files</code>, or try <em>test/*</em>.</p>
  724. <h2></h2>
  725. <ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
  726. </td>
  727. <td class="code">
  728. <pre><code><span class="keyword">function</span> <span class="variable">run</span>(<span class="variable">files</span>) {
  729. <span class="keyword">if</span> (!<span class="variable">files</span>.<span class="variable">length</span>) {
  730. <span class="keyword">try</span> {
  731. <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>){
  732. <span class="keyword">return</span> <span class="string">'test/'</span> + <span class="variable">file</span>;
  733. });
  734. } <span class="keyword">catch</span> (<span class="variable">err</span>) {
  735. <span class="variable">print</span>(<span class="string">'\n failed to load tests in [bold]{./test}\n'</span>);
  736. ++<span class="variable">failures</span>;
  737. <span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
  738. }
  739. }
  740. <span class="keyword">if</span> (<span class="variable">watch</span>) <span class="variable">watchFiles</span>(<span class="variable">files</span>);
  741. <span class="variable">runFiles</span>(<span class="variable">files</span>);
  742. }</code></pre>
  743. </td>
  744. </tr>
  745. <tr class="code">
  746. <td class="docs">
  747. <p>Show the cursor when <code>show</code> is true, otherwise hide it.</p>
  748. <h2></h2>
  749. <ul><li><p><strong>param</strong>: <em>Boolean</em> show</p></li></ul>
  750. </td>
  751. <td class="code">
  752. <pre><code><span class="keyword">function</span> <span class="variable">cursor</span>(<span class="variable">show</span>) {
  753. <span class="keyword">if</span> (<span class="variable">show</span>) {
  754. <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25h'</span>);
  755. } <span class="keyword">else</span> {
  756. <span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25l'</span>);
  757. }
  758. }</code></pre>
  759. </td>
  760. </tr>
  761. <tr class="code">
  762. <td class="docs">
  763. <p>Run the given test <code>files</code>.</p>
  764. <h2></h2>
  765. <ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
  766. </td>
  767. <td class="code">
  768. <pre><code><span class="keyword">function</span> <span class="variable">runFiles</span>(<span class="variable">files</span>) {
  769. <span class="keyword">if</span> (<span class="variable">serial</span>) {
  770. (<span class="keyword">function</span> <span class="variable">next</span>(){
  771. <span class="keyword">if</span> (<span class="variable">files</span>.<span class="variable">length</span>) {
  772. <span class="variable">runFile</span>(<span class="variable">files</span>.<span class="variable">shift</span>(), <span class="variable">next</span>);
  773. }
  774. })();
  775. } <span class="keyword">else</span> {
  776. <span class="variable">files</span>.<span class="variable">forEach</span>(<span class="variable">runFile</span>);
  777. }
  778. }</code></pre>
  779. </td>
  780. </tr>
  781. <tr class="code">
  782. <td class="docs">
  783. <p>Run tests for the given <code>file</code>, callback <code>fn()</code> when finished.</p>
  784. <h2></h2>
  785. <ul><li><p><strong>param</strong>: <em>String</em> file</p></li><li><p><strong>param</strong>: <em>Function</em> fn</p></li></ul>
  786. </td>
  787. <td class="code">
  788. <pre><code><span class="keyword">function</span> <span class="variable">runFile</span>(<span class="variable">file</span>, <span class="variable">fn</span>) {
  789. <span class="keyword">if</span> (<span class="variable">file</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
  790. <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>),
  791. <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>),
  792. <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>));
  793. (<span class="keyword">function</span> <span class="variable">check</span>(){
  794. <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>;
  795. <span class="keyword">if</span> (<span class="variable">len</span>) {
  796. <span class="variable">runSuite</span>(<span class="variable">title</span>, <span class="variable">mod</span>, <span class="variable">fn</span>);
  797. } <span class="keyword">else</span> {
  798. <span class="variable">setTimeout</span>(<span class="variable">check</span>, <span class="number integer">20</span>);
  799. }
  800. })();
  801. }
  802. }</code></pre>
  803. </td>
  804. </tr>
  805. <tr class="code">
  806. <td class="docs">
  807. <p>Clear the module cache for the given <code>file</code>.</p>
  808. <h2></h2>
  809. <ul><li><p><strong>param</strong>: <em>String</em> file</p></li></ul>
  810. </td>
  811. <td class="code">
  812. <pre><code><span class="keyword">function</span> <span class="variable">clearCache</span>(<span class="variable">file</span>) {
  813. <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>);
  814. <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>) {
  815. <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">keys</span>[<span class="variable">i</span>];
  816. <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>) {
  817. <span class="keyword">delete</span> <span class="variable">module</span>.<span class="variable">moduleCache</span>[<span class="variable">key</span>];
  818. }
  819. }
  820. }</code></pre>
  821. </td>
  822. </tr>
  823. <tr class="code">
  824. <td class="docs">
  825. <p>Watch the given <code>files</code> for changes.</p>
  826. <h2></h2>
  827. <ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
  828. </td>
  829. <td class="code">
  830. <pre><code><span class="keyword">function</span> <span class="variable">watchFiles</span>(<span class="variable">files</span>) {
  831. <span class="keyword">var</span> <span class="variable">p</span> = <span class="number integer">0</span>,
  832. <span class="variable">c</span> = [<span class="string">'? '</span>, <span class="string">'?? '</span>, <span class="string">'??? '</span>, <span class="string">' ???'</span>,
  833. <span class="string">' ??'</span>, <span class="string">' ?'</span>, <span class="string">' ?'</span>, <span class="string">' ??'</span>,
  834. <span class="string">'??? '</span>, <span class="string">'?? '</span>, <span class="string">'? '</span>],
  835. <span class="variable">l</span> = <span class="variable">c</span>.<span class="variable">length</span>;
  836. <span class="variable">cursor</span>(<span class="variable">false</span>);
  837. <span class="variable">setInterval</span>(<span class="keyword">function</span>(){
  838. <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>));
  839. }, <span class="number integer">100</span>);
  840. <span class="variable">files</span>.<span class="variable">forEach</span>(<span class="keyword">function</span>(<span class="variable">file</span>){
  841. <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>){
  842. <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>) {
  843. <span class="variable">print</span>(<span class="string">' [yellow]{?} '</span> + <span class="variable">file</span>);
  844. <span class="variable">clearCache</span>(<span class="variable">file</span>);
  845. <span class="variable">runFile</span>(<span class="variable">file</span>);
  846. }
  847. });
  848. });
  849. }</code></pre>
  850. </td>
  851. </tr>
  852. <tr class="code">
  853. <td class="docs">
  854. <p>Report <code>err</code> for the given <code>test</code> and <code>suite</code>.</p>
  855. <h2></h2>
  856. <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>
  857. </td>
  858. <td class="code">
  859. <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>) {
  860. ++<span class="variable">failures</span>;
  861. <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">err</span>.<span class="variable">name</span>,
  862. <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>),
  863. <span class="keyword">label</span> = <span class="variable">test</span> === <span class="string">'uncaught'</span>
  864. ? <span class="variable">test</span>
  865. : <span class="variable">suite</span> + <span class="string">' '</span> + <span class="variable">test</span>;
  866. <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>);
  867. <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>);
  868. }</code></pre>
  869. </td>
  870. </tr>
  871. <tr class="code">
  872. <td class="docs">
  873. <p>Run the given tests, callback <code>fn()</code> when finished.</p>
  874. <h2></h2>
  875. <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>
  876. </td>
  877. <td class="code">
  878. <pre><code><span class="keyword">var</span> <span class="variable">dots</span> = <span class="number integer">0</span>;
  879. <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>) {
  880. <span