mirror of
https://github.com/jsdoc/jsdoc.git
synced 2025-12-08 19:46:11 +00:00
Added ejs templates.
This commit is contained in:
parent
f57d474826
commit
6ba7b8f5b0
3
node_modules/ejs/.gitignore
generated
vendored
Normal file
3
node_modules/ejs/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# ignore any vim files:
|
||||
*.sw[a-z]
|
||||
vim/.netrwhist
|
||||
3
node_modules/ejs/.gitmodules
generated
vendored
Normal file
3
node_modules/ejs/.gitmodules
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "support/expresso"]
|
||||
path = support/expresso
|
||||
url = http://github.com/visionmedia/expresso.git
|
||||
60
node_modules/ejs/History.md
generated
vendored
Normal file
60
node_modules/ejs/History.md
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
0.4.1 / 2011-04-21
|
||||
==================
|
||||
|
||||
* Fixed error context
|
||||
|
||||
0.4.0 / 2011-04-21
|
||||
==================
|
||||
|
||||
* Added; ported jade's error reporting to ejs. [slaskis]
|
||||
|
||||
0.3.1 / 2011-02-23
|
||||
==================
|
||||
|
||||
* Fixed optional `compile()` options
|
||||
|
||||
0.3.0 / 2011-02-14
|
||||
==================
|
||||
|
||||
* Added 'json' filter [Yuriy Bogdanov]
|
||||
* Use exported version of parse function to allow monkey-patching [Anatoliy Chakkaev]
|
||||
|
||||
0.2.1 / 2010-10-07
|
||||
==================
|
||||
|
||||
* Added filter support
|
||||
* Fixed _cache_ option. ~4x performance increase
|
||||
|
||||
0.2.0 / 2010-08-05
|
||||
==================
|
||||
|
||||
* Added support for global tag config
|
||||
* Added custom tag support. Closes #5
|
||||
* Fixed whitespace bug. Closes #4
|
||||
|
||||
0.1.0 / 2010-08-04
|
||||
==================
|
||||
|
||||
* Faster implementation [ashleydev]
|
||||
|
||||
0.0.4 / 2010-08-02
|
||||
==================
|
||||
|
||||
* Fixed single quotes for content outside of template tags. [aniero]
|
||||
* Changed; `exports.compile()` now expects only "locals"
|
||||
|
||||
0.0.3 / 2010-07-15
|
||||
==================
|
||||
|
||||
* Fixed single quotes
|
||||
|
||||
0.0.2 / 2010-07-09
|
||||
==================
|
||||
|
||||
* Fixed newline preservation
|
||||
|
||||
0.0.1 / 2010-07-09
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
5
node_modules/ejs/Makefile
generated
vendored
Normal file
5
node_modules/ejs/Makefile
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
test:
|
||||
@./support/expresso/bin/expresso -I lib test/*.test.js
|
||||
|
||||
.PHONY: test
|
||||
137
node_modules/ejs/Readme.md
generated
vendored
Normal file
137
node_modules/ejs/Readme.md
generated
vendored
Normal file
@ -0,0 +1,137 @@
|
||||
|
||||
# EJS
|
||||
|
||||
Embedded JavaScript templates.
|
||||
|
||||
## Installation
|
||||
|
||||
$ npm install ejs
|
||||
|
||||
## Features
|
||||
|
||||
* Complies with the [Express](http://expressjs.com) view system
|
||||
* Static caching of intermediate JavaScript
|
||||
* Unbuffered code for conditionals etc `<% code %>`
|
||||
* Escapes html by default with `<%= code %>`
|
||||
* Unescaped buffering with `<%- code %>`
|
||||
* Supports tag customization
|
||||
* Filter support for designer-friendly templates
|
||||
|
||||
## Example
|
||||
|
||||
<% if (user) { %>
|
||||
<h2><%= user.name %></h2>
|
||||
<% } %>
|
||||
|
||||
## Usage
|
||||
|
||||
ejs.compile(str, options);
|
||||
// => Function
|
||||
|
||||
ejs.render(str, options);
|
||||
// => str
|
||||
|
||||
## Options
|
||||
|
||||
- `locals` Local variables object
|
||||
- `cache` Compiled functions are cached, requires `filename`
|
||||
- `filename` Used by `cache` to key caches
|
||||
- `scope` Function execution context
|
||||
- `debug` Output generated function body
|
||||
- `open` Open tag, defaulting to "<%"
|
||||
- `close` Closing tag, defaulting to "%>"
|
||||
|
||||
## Custom Tags
|
||||
|
||||
Custom tags can also be applied globally:
|
||||
|
||||
var ejs = require('ejs');
|
||||
ejs.open = '{{';
|
||||
ejs.close = '}}';
|
||||
|
||||
Which would make the following a valid template:
|
||||
|
||||
<h1>{{= title }}</h1>
|
||||
|
||||
## Filters
|
||||
|
||||
EJS conditionally supports the concept of "filters". A "filter chain"
|
||||
is a designer friendly api for manipulating data, without writing JavaScript.
|
||||
|
||||
Filters can be applied by supplying the _:_ modifier, so for example if we wish to take the array `[{ name: 'tj' }, { name: 'mape' }, { name: 'guillermo' }]` and output a list of names we can do this simply with filters:
|
||||
|
||||
Template:
|
||||
|
||||
<p><%=: users | map:'name' | join %></p>
|
||||
|
||||
Output:
|
||||
|
||||
<p>Tj, Mape, Guillermo</p>
|
||||
|
||||
Render call:
|
||||
|
||||
ejs.render(str, {
|
||||
locals: {
|
||||
users: [
|
||||
{ name: 'tj' },
|
||||
{ name: 'mape' },
|
||||
{ name: 'guillermo' }
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
Or perhaps capitalize the first user's name for display:
|
||||
|
||||
<p><%=: users | first | capitalize %></p>
|
||||
|
||||
## Filter List
|
||||
|
||||
Currently these filters are available:
|
||||
|
||||
- first
|
||||
- last
|
||||
- capitalize
|
||||
- downcase
|
||||
- upcase
|
||||
- sort
|
||||
- sort_by:'prop'
|
||||
- size
|
||||
- length
|
||||
- plus:n
|
||||
- minus:n
|
||||
- times:n
|
||||
- divided_by:n
|
||||
- join:'val'
|
||||
- truncate:n
|
||||
- truncate_words:n
|
||||
- replace:pattern,substitution
|
||||
- prepend:val
|
||||
- append:val
|
||||
- map:'prop'
|
||||
- reverse
|
||||
- get:'prop'
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
14
node_modules/ejs/benchmark.js
generated
vendored
Normal file
14
node_modules/ejs/benchmark.js
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
|
||||
var ejs = require('./lib/ejs'),
|
||||
str = '<% if (foo) { %><p><%= foo %></p><% } %>',
|
||||
times = 50000;
|
||||
|
||||
console.log('rendering ' + times + ' times');
|
||||
|
||||
var start = new Date;
|
||||
while (times--) {
|
||||
ejs.render(str, { cache: true, filename: 'test', locals: { foo: 'bar' }});
|
||||
}
|
||||
|
||||
console.log('took ' + (new Date - start) + 'ms');
|
||||
7
node_modules/ejs/examples/list.ejs
generated
vendored
Normal file
7
node_modules/ejs/examples/list.ejs
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
<% if (names.length) { %>
|
||||
<ul>
|
||||
<% names.forEach(function(name){ %>
|
||||
<li><%= name %></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<% } %>
|
||||
16
node_modules/ejs/examples/list.js
generated
vendored
Normal file
16
node_modules/ejs/examples/list.js
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var ejs = require('../')
|
||||
, fs = require('fs')
|
||||
, str = fs.readFileSync(__dirname + '/list.ejs', 'utf8');
|
||||
|
||||
var ret = ejs.render(str, {
|
||||
locals: {
|
||||
names: ['foo', 'bar', 'baz']
|
||||
}
|
||||
});
|
||||
|
||||
console.log(ret);
|
||||
2
node_modules/ejs/index.js
generated
vendored
Normal file
2
node_modules/ejs/index.js
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
module.exports = require('./lib/ejs');
|
||||
249
node_modules/ejs/lib/ejs.js
generated
vendored
Normal file
249
node_modules/ejs/lib/ejs.js
generated
vendored
Normal file
@ -0,0 +1,249 @@
|
||||
|
||||
/*!
|
||||
* EJS
|
||||
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var sys = require('sys')
|
||||
, utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Library version.
|
||||
*/
|
||||
|
||||
exports.version = '0.4.1';
|
||||
|
||||
/**
|
||||
* Filters.
|
||||
*
|
||||
* @type Object
|
||||
*/
|
||||
|
||||
var filters = exports.filters = require('./filters');
|
||||
|
||||
/**
|
||||
* Intermediate js cache.
|
||||
*
|
||||
* @type Object
|
||||
*/
|
||||
|
||||
var cache = {};
|
||||
|
||||
/**
|
||||
* Clear intermediate js cache.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
exports.clearCache = function(){
|
||||
cache = {};
|
||||
};
|
||||
|
||||
/**
|
||||
* Translate filtered code into function calls.
|
||||
*
|
||||
* @param {String} js
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function filtered(js) {
|
||||
return js.substr(1).split('|').reduce(function(js, filter){
|
||||
var parts = filter.split(':')
|
||||
, name = parts.shift()
|
||||
, args = parts.shift() || '';
|
||||
if (args) args = ', ' + args;
|
||||
return 'filters.' + name + '(' + js + args + ')';
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Re-throw the given `err` in context to the
|
||||
* `str` of ejs, `filename`, and `lineno`.
|
||||
*
|
||||
* @param {Error} err
|
||||
* @param {String} str
|
||||
* @param {String} filename
|
||||
* @param {String} lineno
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function rethrow(err, str, filename, lineno){
|
||||
var lines = str.split('\n')
|
||||
, start = Math.max(lineno - 3, 0)
|
||||
, end = Math.min(lines.length, lineno + 3);
|
||||
|
||||
// Error context
|
||||
var context = lines.slice(start, end).map(function(line, i){
|
||||
var curr = i + start + 1;
|
||||
return (curr == lineno ? ' >> ' : ' ')
|
||||
+ curr
|
||||
+ '| '
|
||||
+ line;
|
||||
}).join('\n');
|
||||
|
||||
// Alter exception message
|
||||
err.path = filename;
|
||||
err.message = (filename || 'ejs') + ':'
|
||||
+ lineno + '\n'
|
||||
+ context + '\n\n'
|
||||
+ err.message;
|
||||
|
||||
throw err;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given `str` of ejs, returning the function body.
|
||||
*
|
||||
* @param {String} str
|
||||
* @return {String}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
var parse = exports.parse = function(str, options){
|
||||
var options = options || {}
|
||||
, open = options.open || exports.open || '<%'
|
||||
, close = options.close || exports.close || '%>';
|
||||
|
||||
var buf = [
|
||||
"var buf = [];"
|
||||
, "\nwith (locals) {"
|
||||
, "\n buf.push('"
|
||||
];
|
||||
|
||||
var lineno = 1;
|
||||
|
||||
for (var i = 0, len = str.length; i < len; ++i) {
|
||||
if (str.slice(i, open.length + i) == open) {
|
||||
i += open.length
|
||||
|
||||
var prefix, postfix, line = '__stack.lineno=' + lineno;
|
||||
switch (str[i]) {
|
||||
case '=':
|
||||
prefix = "', escape((" + line + ', ';
|
||||
postfix = ")), '";
|
||||
++i;
|
||||
break;
|
||||
case '-':
|
||||
prefix = "', (" + line + ', ';
|
||||
postfix = "), '";
|
||||
++i;
|
||||
break;
|
||||
default:
|
||||
prefix = "');" + line + ';';
|
||||
postfix = "; buf.push('";
|
||||
}
|
||||
|
||||
var start = i;
|
||||
var end = str.indexOf(close, i);
|
||||
var js = str.substring(i, end);
|
||||
if (js[0] == ':') js = filtered(js);
|
||||
buf.push(prefix, js, postfix);
|
||||
i += end - start + close.length - 1;
|
||||
|
||||
} else if (str[i] == "\\") {
|
||||
buf.push("\\\\");
|
||||
} else if (str[i] == "'") {
|
||||
buf.push("\\'");
|
||||
} else if (str[i] == "\r") {
|
||||
buf.push(" ");
|
||||
} else if (str[i] == "\n") {
|
||||
buf.push("\\n");
|
||||
lineno++;
|
||||
} else {
|
||||
buf.push(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
buf.push("');\n}\nreturn buf.join('');");
|
||||
return buf.join('');
|
||||
};
|
||||
|
||||
/**
|
||||
* Compile the given `str` of ejs into a `Function`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Object} options
|
||||
* @return {Function}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
var compile = exports.compile = function(str, options){
|
||||
options = options || {};
|
||||
|
||||
var input = JSON.stringify(str)
|
||||
, filename = options.filename
|
||||
? JSON.stringify(options.filename)
|
||||
: 'undefined';
|
||||
|
||||
// Adds the fancy stack trace meta info
|
||||
str = [
|
||||
'var __stack = { lineno: 1, input: ' + input + ', filename: ' + filename + ' };',
|
||||
rethrow.toString(),
|
||||
'try {',
|
||||
exports.parse(str, options),
|
||||
'} catch (err) {',
|
||||
' rethrow(err, __stack.input, __stack.filename, __stack.lineno);',
|
||||
'}'
|
||||
].join("\n");
|
||||
|
||||
if (options.debug) sys.puts(str);
|
||||
var fn = new Function('locals, filters, escape', str);
|
||||
return function(locals){
|
||||
return fn.call(this, locals, filters, utils.escape);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Render the given `str` of ejs.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `locals` Local variables object
|
||||
* - `cache` Compiled functions are cached, requires `filename`
|
||||
* - `filename` Used by `cache` to key caches
|
||||
* - `scope` Function execution context
|
||||
* - `debug` Output generated function body
|
||||
* - `open` Open tag, defaulting to "<%"
|
||||
* - `close` Closing tag, defaulting to "%>"
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Object} options
|
||||
* @return {String}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
exports.render = function(str, options){
|
||||
var fn
|
||||
, options = options || {};
|
||||
if (options.cache) {
|
||||
if (options.filename) {
|
||||
fn = cache[options.filename] || (cache[options.filename] = compile(str, options));
|
||||
} else {
|
||||
throw new Error('"cache" option requires "filename".');
|
||||
}
|
||||
} else {
|
||||
fn = compile(str, options);
|
||||
}
|
||||
return fn.call(options.scope, options.locals || {});
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose to require().
|
||||
*/
|
||||
|
||||
if (require.extensions) {
|
||||
require.extensions['.ejs'] = function(module, filename) {
|
||||
source = require('fs').readFileSync(filename, 'utf-8');
|
||||
module._compile(compile(source, {}), filename);
|
||||
};
|
||||
} else if (require.registerExtension) {
|
||||
require.registerExtension('.ejs', function(src) {
|
||||
return compile(src, {});
|
||||
});
|
||||
}
|
||||
198
node_modules/ejs/lib/filters.js
generated
vendored
Normal file
198
node_modules/ejs/lib/filters.js
generated
vendored
Normal file
@ -0,0 +1,198 @@
|
||||
|
||||
/*!
|
||||
* EJS - Filters
|
||||
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
/**
|
||||
* First element of the target `obj`.
|
||||
*/
|
||||
|
||||
exports.first = function(obj) {
|
||||
return obj[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* Last element of the target `obj`.
|
||||
*/
|
||||
|
||||
exports.last = function(obj) {
|
||||
return obj[obj.length - 1];
|
||||
};
|
||||
|
||||
/**
|
||||
* Capitalize the first letter of the target `str`.
|
||||
*/
|
||||
|
||||
exports.capitalize = function(str){
|
||||
str = String(str);
|
||||
return str[0].toUpperCase() + str.substr(1, str.length);
|
||||
};
|
||||
|
||||
/**
|
||||
* Downcase the target `str`.
|
||||
*/
|
||||
|
||||
exports.downcase = function(str){
|
||||
return String(str).toLowerCase();
|
||||
};
|
||||
|
||||
/**
|
||||
* Uppercase the target `str`.
|
||||
*/
|
||||
|
||||
exports.upcase = function(str){
|
||||
return String(str).toUpperCase();
|
||||
};
|
||||
|
||||
/**
|
||||
* Sort the target `obj`.
|
||||
*/
|
||||
|
||||
exports.sort = function(obj){
|
||||
return Object.create(obj).sort();
|
||||
};
|
||||
|
||||
/**
|
||||
* Sort the target `obj` by the given `prop` ascending.
|
||||
*/
|
||||
|
||||
exports.sort_by = function(obj, prop){
|
||||
return Object.create(obj).sort(function(a, b){
|
||||
a = a[prop], b = b[prop];
|
||||
if (a > b) return 1;
|
||||
if (a < b) return -1;
|
||||
return 0;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Size or length of the target `obj`.
|
||||
*/
|
||||
|
||||
exports.size = exports.length = function(obj) {
|
||||
return obj.length;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add `a` and `b`.
|
||||
*/
|
||||
|
||||
exports.plus = function(a, b){
|
||||
return Number(a) + Number(b);
|
||||
};
|
||||
|
||||
/**
|
||||
* Subtract `b` from `a`.
|
||||
*/
|
||||
|
||||
exports.minus = function(a, b){
|
||||
return Number(a) - Number(b);
|
||||
};
|
||||
|
||||
/**
|
||||
* Multiply `a` by `b`.
|
||||
*/
|
||||
|
||||
exports.times = function(a, b){
|
||||
return Number(a) * Number(b);
|
||||
};
|
||||
|
||||
/**
|
||||
* Divide `a` by `b`.
|
||||
*/
|
||||
|
||||
exports.divided_by = function(a, b){
|
||||
return Number(a) / Number(b);
|
||||
};
|
||||
|
||||
/**
|
||||
* Join `obj` with the given `str`.
|
||||
*/
|
||||
|
||||
exports.join = function(obj, str){
|
||||
return obj.join(str || ', ');
|
||||
};
|
||||
|
||||
/**
|
||||
* Truncate `str` to `len`.
|
||||
*/
|
||||
|
||||
exports.truncate = function(str, len){
|
||||
str = String(str);
|
||||
return str.substr(0, len);
|
||||
};
|
||||
|
||||
/**
|
||||
* Truncate `str` to `n` words.
|
||||
*/
|
||||
|
||||
exports.truncate_words = function(str, n){
|
||||
var str = String(str)
|
||||
, words = str.split(/ +/);
|
||||
return words.slice(0, n).join(' ');
|
||||
};
|
||||
|
||||
/**
|
||||
* Replace `pattern` with `substitution` in `str`.
|
||||
*/
|
||||
|
||||
exports.replace = function(str, pattern, substitution){
|
||||
return String(str).replace(pattern, substitution || '');
|
||||
};
|
||||
|
||||
/**
|
||||
* Prepend `val` to `obj`.
|
||||
*/
|
||||
|
||||
exports.prepend = function(obj, val){
|
||||
return Array.isArray(obj)
|
||||
? [val].concat(obj)
|
||||
: val + obj;
|
||||
};
|
||||
|
||||
/**
|
||||
* Append `val` to `obj`.
|
||||
*/
|
||||
|
||||
exports.append = function(obj, val){
|
||||
return Array.isArray(obj)
|
||||
? obj.concat(val)
|
||||
: obj + val;
|
||||
};
|
||||
|
||||
/**
|
||||
* Map the given `prop`.
|
||||
*/
|
||||
|
||||
exports.map = function(arr, prop){
|
||||
return arr.map(function(obj){
|
||||
return obj[prop];
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Reverse the given `obj`.
|
||||
*/
|
||||
|
||||
exports.reverse = function(obj){
|
||||
return Array.isArray(obj)
|
||||
? obj.reverse()
|
||||
: String(obj).split('').reverse().join('');
|
||||
};
|
||||
|
||||
/**
|
||||
* Get `prop` of the given `obj`.
|
||||
*/
|
||||
|
||||
exports.get = function(obj, prop){
|
||||
return obj[prop];
|
||||
};
|
||||
|
||||
/**
|
||||
* Packs the given `obj` into json string
|
||||
*/
|
||||
exports.json = function(obj){
|
||||
return JSON.stringify(obj);
|
||||
};
|
||||
23
node_modules/ejs/lib/utils.js
generated
vendored
Normal file
23
node_modules/ejs/lib/utils.js
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
/*!
|
||||
* EJS
|
||||
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
/**
|
||||
* Escape the given string of `html`.
|
||||
*
|
||||
* @param {String} html
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
exports.escape = function(html){
|
||||
return String(html)
|
||||
.replace(/&(?!\w+;)/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
};
|
||||
|
||||
8
node_modules/ejs/package.json
generated
vendored
Normal file
8
node_modules/ejs/package.json
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "ejs",
|
||||
"description": "Embedded JavaScript templates",
|
||||
"version": "0.4.1",
|
||||
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
||||
"keywords": ["template", "engine", "ejs"],
|
||||
"main": "./lib/ejs.js"
|
||||
}
|
||||
3
node_modules/ejs/support/expresso/.gitignore
generated
vendored
Normal file
3
node_modules/ejs/support/expresso/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
.DS_Store
|
||||
lib-cov
|
||||
*.seed
|
||||
3
node_modules/ejs/support/expresso/.gitmodules
generated
vendored
Normal file
3
node_modules/ejs/support/expresso/.gitmodules
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "deps/jscoverage"]
|
||||
path = deps/jscoverage
|
||||
url = git://github.com/visionmedia/node-jscoverage.git
|
||||
87
node_modules/ejs/support/expresso/History.md
generated
vendored
Normal file
87
node_modules/ejs/support/expresso/History.md
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
|
||||
0.6.2 / 2010-08-03
|
||||
==================
|
||||
|
||||
* Added `assert.type()`
|
||||
* Renamed `assert.isNotUndefined()` to `assert.isDefined()`
|
||||
* Fixed `assert.includes()` param ordering
|
||||
|
||||
0.6.0 / 2010-07-31
|
||||
==================
|
||||
|
||||
* Added _docs/api.html_
|
||||
* Added -w, --watch
|
||||
* Added `Array` support to `assert.includes()`
|
||||
* Added; outputting exceptions immediately. Closes #19
|
||||
* Fixed `assert.includes()` param ordering
|
||||
* Fixed `assert.length()` param ordering
|
||||
* Fixed jscoverage links
|
||||
|
||||
0.5.0 / 2010-07-16
|
||||
==================
|
||||
|
||||
* Added support for async exports
|
||||
* Added timeout support to `assert.response()`. Closes #3
|
||||
* Added 4th arg callback support to `assert.response()`
|
||||
* Added `assert.length()`
|
||||
* Added `assert.match()`
|
||||
* Added `assert.isUndefined()`
|
||||
* Added `assert.isNull()`
|
||||
* Added `assert.includes()`
|
||||
* Added growlnotify support via -g, --growl
|
||||
* Added -o, --only TESTS. Ex: --only "test foo()" --only "test foo(), test bar()"
|
||||
* Removed profanity
|
||||
|
||||
0.4.0 / 2010-07-09
|
||||
==================
|
||||
|
||||
* Added reporting source coverage (respects --boring for color haters)
|
||||
* Added callback to assert.response(). Closes #12
|
||||
* Fixed; putting exceptions to stderr. Closes #13
|
||||
|
||||
0.3.1 / 2010-06-28
|
||||
==================
|
||||
|
||||
* Faster assert.response()
|
||||
|
||||
0.3.0 / 2010-06-28
|
||||
==================
|
||||
|
||||
* Added -p, --port NUM flags
|
||||
* Added assert.response(). Closes #11
|
||||
|
||||
0.2.1 / 2010-06-25
|
||||
==================
|
||||
|
||||
* Fixed issue with reporting object assertions
|
||||
|
||||
0.2.0 / 2010-06-21
|
||||
==================
|
||||
|
||||
* Added `make uninstall`
|
||||
* Added better readdir() failure message
|
||||
* Fixed `make install` for kiwi
|
||||
|
||||
0.1.0 / 2010-06-15
|
||||
==================
|
||||
|
||||
* Added better usage docs via --help
|
||||
* Added better conditional color support
|
||||
* Added pre exit assertion support
|
||||
|
||||
0.0.3 / 2010-06-02
|
||||
==================
|
||||
|
||||
* Added more room for filenames in test coverage
|
||||
* Added boring output support via --boring (suppress colored output)
|
||||
* Fixed async failure exit status
|
||||
|
||||
0.0.2 / 2010-05-30
|
||||
==================
|
||||
|
||||
* Fixed exit status for CI support
|
||||
|
||||
0.0.1 / 2010-05-30
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
50
node_modules/ejs/support/expresso/Makefile
generated
vendored
Normal file
50
node_modules/ejs/support/expresso/Makefile
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
|
||||
BIN = bin/expresso
|
||||
PREFIX = /usr/local
|
||||
JSCOV = deps/jscoverage/node-jscoverage
|
||||
DOCS = docs/index.md
|
||||
HTMLDOCS = $(DOCS:.md=.html)
|
||||
|
||||
test: $(BIN)
|
||||
@./$(BIN) -I lib --growl $(TEST_FLAGS) test/*.test.js
|
||||
|
||||
test-cov:
|
||||
@./$(BIN) -I lib --cov $(TEST_FLAGS) test/*.test.js
|
||||
|
||||
install: install-jscov install-expresso
|
||||
|
||||
uninstall:
|
||||
rm -f $(PREFIX)/bin/expresso
|
||||
rm -f $(PREFIX)/bin/node-jscoverage
|
||||
|
||||
install-jscov: $(JSCOV)
|
||||
install $(JSCOV) $(PREFIX)/bin
|
||||
|
||||
install-expresso:
|
||||
install $(BIN) $(PREFIX)/bin
|
||||
|
||||
$(JSCOV):
|
||||
cd deps/jscoverage && ./configure && make && mv jscoverage node-jscoverage
|
||||
|
||||
clean:
|
||||
@cd deps/jscoverage && git clean -fd
|
||||
|
||||
docs: docs/api.html $(HTMLDOCS)
|
||||
|
||||
%.html: %.md
|
||||
@echo "... $< > $@"
|
||||
@ronn -5 --pipe --fragment $< \
|
||||
| cat docs/layout/head.html - docs/layout/foot.html \
|
||||
> $@
|
||||
|
||||
docs/api.html: bin/expresso
|
||||
dox \
|
||||
--title "Expresso" \
|
||||
--ribbon "http://github.com/visionmedia/expresso" \
|
||||
--desc "Insanely fast TDD framework for [node](http://nodejs.org) featuring code coverage reporting." \
|
||||
$< > $@
|
||||
|
||||
docclean:
|
||||
rm -f docs/*.html
|
||||
|
||||
.PHONY: test test-cov install uninstall install-expresso install-jscov clean docs docclean
|
||||
39
node_modules/ejs/support/expresso/Readme.md
generated
vendored
Normal file
39
node_modules/ejs/support/expresso/Readme.md
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
# Expresso
|
||||
|
||||
TDD framework for [nodejs](http://nodejs.org).
|
||||
|
||||
## Features
|
||||
|
||||
- light-weight
|
||||
- intuitive async support
|
||||
- intuitive test runner executable
|
||||
- test coverage support and reporting
|
||||
- uses the _assert_ module
|
||||
- `assert.eql()` alias of `assert.deepEqual()`
|
||||
- `assert.response()` http response utility
|
||||
- `assert.includes()`
|
||||
- `assert.type()`
|
||||
- `assert.isNull()`
|
||||
- `assert.isUndefined()`
|
||||
- `assert.isNotNull()`
|
||||
- `assert.isDefined()`
|
||||
- `assert.match()`
|
||||
- `assert.length()`
|
||||
|
||||
## Installation
|
||||
|
||||
To install both expresso _and_ node-jscoverage run:
|
||||
|
||||
$ make install
|
||||
|
||||
To install expresso alone (no build required) run:
|
||||
|
||||
$ make install-expresso
|
||||
|
||||
Install via npm:
|
||||
|
||||
$ npm install expresso
|
||||
|
||||
|
||||
|
||||
775
node_modules/ejs/support/expresso/bin/expresso
generated
vendored
Executable file
775
node_modules/ejs/support/expresso/bin/expresso
generated
vendored
Executable file
@ -0,0 +1,775 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/*!
|
||||
* Expresso
|
||||
* Copyright(c) TJ Holowaychuk <tj@vision-media.ca>
|
||||
* (MIT Licensed)
|
||||
*/
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var assert = require('assert'),
|
||||
childProcess = require('child_process'),
|
||||
http = require('http'),
|
||||
path = require('path'),
|
||||
sys = require('sys'),
|
||||
cwd = process.cwd(),
|
||||
fs = require('fs'),
|
||||
defer;
|
||||
|
||||
/**
|
||||
* Expresso version.
|
||||
*/
|
||||
|
||||
var version = '0.6.1';
|
||||
|
||||
/**
|
||||
* Failure count.
|
||||
*/
|
||||
|
||||
var failures = 0;
|
||||
|
||||
|
||||
/**
|
||||
* Number of tests executed.
|
||||
*/
|
||||
|
||||
var testcount = 0;
|
||||
|
||||
/**
|
||||
* Whitelist of tests to run.
|
||||
*/
|
||||
|
||||
var only = [];
|
||||
|
||||
/**
|
||||
* Boring output.
|
||||
*/
|
||||
|
||||
var boring = false;
|
||||
|
||||
/**
|
||||
* Growl notifications.
|
||||
*/
|
||||
|
||||
var growl = false;
|
||||
|
||||
/**
|
||||
* Server port.
|
||||
*/
|
||||
|
||||
var port = 5555;
|
||||
|
||||
/**
|
||||
* Watch mode.
|
||||
*/
|
||||
|
||||
var watch = false;
|
||||
|
||||
/**
|
||||
* Usage documentation.
|
||||
*/
|
||||
|
||||
var usage = ''
|
||||
+ '[bold]{Usage}: expresso [options] <file ...>'
|
||||
+ '\n'
|
||||
+ '\n[bold]{Options}:'
|
||||
+ '\n -w, --watch Watch for modifications and re-execute tests'
|
||||
+ '\n -g, --growl Enable growl notifications'
|
||||
+ '\n -c, --coverage Generate and report test coverage'
|
||||
+ '\n -r, --require PATH Require the given module path'
|
||||
+ '\n -o, --only TESTS Execute only the comma sperated TESTS (can be set several times)'
|
||||
+ '\n -I, --include PATH Unshift the given path to require.paths'
|
||||
+ '\n -p, --port NUM Port number for test servers, starts at 5555'
|
||||
+ '\n -b, --boring Suppress ansi-escape colors'
|
||||
+ '\n -v, --version Output version number'
|
||||
+ '\n -h, --help Display help information'
|
||||
+ '\n';
|
||||
|
||||
// Parse arguments
|
||||
|
||||
var files = [],
|
||||
args = process.argv.slice(2);
|
||||
|
||||
while (args.length) {
|
||||
var arg = args.shift();
|
||||
switch (arg) {
|
||||
case '-h':
|
||||
case '--help':
|
||||
print(usage + '\n');
|
||||
process.exit(1);
|
||||
break;
|
||||
case '-v':
|
||||
case '--version':
|
||||
sys.puts(version);
|
||||
process.exit(1);
|
||||
break;
|
||||
case '-i':
|
||||
case '-I':
|
||||
case '--include':
|
||||
if (arg = args.shift()) {
|
||||
require.paths.unshift(arg);
|
||||
} else {
|
||||
throw new Error('--include requires a path');
|
||||
}
|
||||
break;
|
||||
case '-o':
|
||||
case '--only':
|
||||
if (arg = args.shift()) {
|
||||
only = only.concat(arg.split(/ *, */));
|
||||
} else {
|
||||
throw new Error('--only requires comma-separated test names');
|
||||
}
|
||||
break;
|
||||
case '-p':
|
||||
case '--port':
|
||||
if (arg = args.shift()) {
|
||||
port = parseInt(arg, 10);
|
||||
} else {
|
||||
throw new Error('--port requires a number');
|
||||
}
|
||||
break;
|
||||
case '-r':
|
||||
case '--require':
|
||||
if (arg = args.shift()) {
|
||||
require(arg);
|
||||
} else {
|
||||
throw new Error('--require requires a path');
|
||||
}
|
||||
break;
|
||||
case '-c':
|
||||
case '--cov':
|
||||
case '--coverage':
|
||||
defer = true;
|
||||
childProcess.exec('rm -fr lib-cov && node-jscoverage lib lib-cov', function(err){
|
||||
if (err) throw err;
|
||||
require.paths.unshift('lib-cov');
|
||||
run(files);
|
||||
})
|
||||
break;
|
||||
case '-b':
|
||||
case '--boring':
|
||||
boring = true;
|
||||
break;
|
||||
case '-w':
|
||||
case '--watch':
|
||||
watch = true;
|
||||
break;
|
||||
case '--g':
|
||||
case '--growl':
|
||||
growl = true;
|
||||
break;
|
||||
default:
|
||||
if (/\.js$/.test(arg)) {
|
||||
files.push(arg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Colorized sys.error().
|
||||
*
|
||||
* @param {String} str
|
||||
*/
|
||||
|
||||
function print(str){
|
||||
sys.error(colorize(str));
|
||||
}
|
||||
|
||||
/**
|
||||
* Colorize the given string using ansi-escape sequences.
|
||||
* Disabled when --boring is set.
|
||||
*
|
||||
* @param {String} str
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
function colorize(str){
|
||||
var colors = { bold: 1, red: 31, green: 32, yellow: 33 };
|
||||
return str.replace(/\[(\w+)\]\{([^]*?)\}/g, function(_, color, str){
|
||||
return boring
|
||||
? str
|
||||
: '\x1B[' + colors[color] + 'm' + str + '\x1B[0m';
|
||||
});
|
||||
}
|
||||
|
||||
// Alias deepEqual as eql for complex equality
|
||||
|
||||
assert.eql = assert.deepEqual;
|
||||
|
||||
/**
|
||||
* Assert that `val` is null.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.isNull = function(val, msg) {
|
||||
assert.strictEqual(null, val, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `val` is not null.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.isNotNull = function(val, msg) {
|
||||
assert.notStrictEqual(null, val, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `val` is undefined.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.isUndefined = function(val, msg) {
|
||||
assert.strictEqual(undefined, val, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `val` is not undefined.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.isDefined = function(val, msg) {
|
||||
assert.notStrictEqual(undefined, val, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `obj` is `type`.
|
||||
*
|
||||
* @param {Mixed} obj
|
||||
* @param {String} type
|
||||
* @api public
|
||||
*/
|
||||
|
||||
assert.type = function(obj, type, msg){
|
||||
var real = typeof obj;
|
||||
msg = msg || 'typeof ' + sys.inspect(obj) + ' is ' + real + ', expected ' + type;
|
||||
assert.ok(type === real, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `str` matches `regexp`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {RegExp} regexp
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.match = function(str, regexp, msg) {
|
||||
msg = msg || sys.inspect(str) + ' does not match ' + sys.inspect(regexp);
|
||||
assert.ok(regexp.test(str), msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert that `val` is within `obj`.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* assert.includes('foobar', 'bar');
|
||||
* assert.includes(['foo', 'bar'], 'foo');
|
||||
*
|
||||
* @param {String|Array} obj
|
||||
* @param {Mixed} val
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.includes = function(obj, val, msg) {
|
||||
msg = msg || sys.inspect(obj) + ' does not include ' + sys.inspect(val);
|
||||
assert.ok(obj.indexOf(val) >= 0, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert length of `val` is `n`.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @param {Number} n
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.length = function(val, n, msg) {
|
||||
msg = msg || sys.inspect(val) + ' has length of ' + val.length + ', expected ' + n;
|
||||
assert.equal(n, val.length, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
* Assert response from `server` with
|
||||
* the given `req` object and `res` assertions object.
|
||||
*
|
||||
* @param {Server} server
|
||||
* @param {Object} req
|
||||
* @param {Object|Function} res
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
assert.response = function(server, req, res, msg){
|
||||
// Callback as third or fourth arg
|
||||
var callback = typeof res === 'function'
|
||||
? res
|
||||
: typeof msg === 'function'
|
||||
? msg
|
||||
: function(){};
|
||||
|
||||
// Default messate to test title
|
||||
if (typeof msg === 'function') msg = null;
|
||||
msg = msg || assert.testTitle;
|
||||
msg += '. ';
|
||||
|
||||
// Pending responses
|
||||
server.__pending = server.__pending || 0;
|
||||
server.__pending++;
|
||||
|
||||
// Create client
|
||||
if (!server.fd) {
|
||||
server.listen(server.__port = port++);
|
||||
server.client = http.createClient(server.__port);
|
||||
}
|
||||
|
||||
// Issue request
|
||||
var timer,
|
||||
client = server.client,
|
||||
method = req.method || 'GET',
|
||||
status = res.status || res.statusCode,
|
||||
data = req.data || req.body,
|
||||
timeout = req.timeout || 0;
|
||||
|
||||
var request = client.request(method, req.url, req.headers);
|
||||
|
||||
// Timeout
|
||||
if (timeout) {
|
||||
timer = setTimeout(function(){
|
||||
--server.__pending || server.close();
|
||||
delete req.timeout;
|
||||
assert.fail(msg + 'Request timed out after ' + timeout + 'ms.');
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
if (data) request.write(data);
|
||||
request.addListener('response', function(response){
|
||||
response.body = '';
|
||||
response.setEncoding('utf8');
|
||||
response.addListener('data', function(chunk){ response.body += chunk; });
|
||||
response.addListener('end', function(){
|
||||
--server.__pending || server.close();
|
||||
if (timer) clearTimeout(timer);
|
||||
|
||||
// Assert response body
|
||||
if (res.body !== undefined) {
|
||||
assert.equal(
|
||||
response.body,
|
||||
res.body,
|
||||
msg + 'Invalid response body.\n'
|
||||
+ ' Expected: ' + sys.inspect(res.body) + '\n'
|
||||
+ ' Got: ' + sys.inspect(response.body)
|
||||
);
|
||||
}
|
||||
|
||||
// Assert response status
|
||||
if (typeof status === 'number') {
|
||||
assert.equal(
|
||||
response.statusCode,
|
||||
status,
|
||||
msg + colorize('Invalid response status code.\n'
|
||||
+ ' Expected: [green]{' + status + '}\n'
|
||||
+ ' Got: [red]{' + response.statusCode + '}')
|
||||
);
|
||||
}
|
||||
|
||||
// Assert response headers
|
||||
if (res.headers) {
|
||||
var keys = Object.keys(res.headers);
|
||||
for (var i = 0, len = keys.length; i < len; ++i) {
|
||||
var name = keys[i],
|
||||
actual = response.headers[name.toLowerCase()],
|
||||
expected = res.headers[name];
|
||||
assert.equal(
|
||||
actual,
|
||||
expected,
|
||||
msg + colorize('Invalid response header [bold]{' + name + '}.\n'
|
||||
+ ' Expected: [green]{' + expected + '}\n'
|
||||
+ ' Got: [red]{' + actual + '}')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Callback
|
||||
callback(response);
|
||||
});
|
||||
});
|
||||
request.end();
|
||||
};
|
||||
|
||||
/**
|
||||
* Pad the given string to the maximum width provided.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Number} width
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
function lpad(str, width) {
|
||||
str = String(str);
|
||||
var n = width - str.length;
|
||||
if (n < 1) return str;
|
||||
while (n--) str = ' ' + str;
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad the given string to the maximum width provided.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Number} width
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
function rpad(str, width) {
|
||||
str = String(str);
|
||||
var n = width - str.length;
|
||||
if (n < 1) return str;
|
||||
while (n--) str = str + ' ';
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report test coverage.
|
||||
*
|
||||
* @param {Object} cov
|
||||
*/
|
||||
|
||||
function reportCoverage(cov) {
|
||||
populateCoverage(cov);
|
||||
// Stats
|
||||
print('\n [bold]{Test Coverage}\n');
|
||||
var sep = ' +------------------------------------------+----------+------+------+--------+',
|
||||
lastSep = ' +----------+------+------+--------+';
|
||||
sys.puts(sep);
|
||||
sys.puts(' | filename | coverage | LOC | SLOC | missed |');
|
||||
sys.puts(sep);
|
||||
for (var name in cov) {
|
||||
var file = cov[name];
|
||||
if (Array.isArray(file)) {
|
||||
sys.print(' | ' + rpad(name, 40));
|
||||
sys.print(' | ' + lpad(file.coverage.toFixed(2), 8));
|
||||
sys.print(' | ' + lpad(file.LOC, 4));
|
||||
sys.print(' | ' + lpad(file.SLOC, 4));
|
||||
sys.print(' | ' + lpad(file.totalMisses, 6));
|
||||
sys.print(' |\n');
|
||||
}
|
||||
}
|
||||
sys.puts(sep);
|
||||
sys.print(' ' + rpad('', 40));
|
||||
sys.print(' | ' + lpad(cov.coverage.toFixed(2), 8));
|
||||
sys.print(' | ' + lpad(cov.LOC, 4));
|
||||
sys.print(' | ' + lpad(cov.SLOC, 4));
|
||||
sys.print(' | ' + lpad(cov.totalMisses, 6));
|
||||
sys.print(' |\n');
|
||||
sys.puts(lastSep);
|
||||
// Source
|
||||
for (var name in cov) {
|
||||
if (name.match(/\.js$/)) {
|
||||
var file = cov[name];
|
||||
print('\n [bold]{' + name + '}:');
|
||||
print(file.source);
|
||||
sys.print('\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate code coverage data.
|
||||
*
|
||||
* @param {Object} cov
|
||||
*/
|
||||
|
||||
function populateCoverage(cov) {
|
||||
cov.LOC =
|
||||
cov.SLOC =
|
||||
cov.totalFiles =
|
||||
cov.totalHits =
|
||||
cov.totalMisses =
|
||||
cov.coverage = 0;
|
||||
for (var name in cov) {
|
||||
var file = cov[name];
|
||||
if (Array.isArray(file)) {
|
||||
// Stats
|
||||
++cov.totalFiles;
|
||||
cov.totalHits += file.totalHits = coverage(file, true);
|
||||
cov.totalMisses += file.totalMisses = coverage(file, false);
|
||||
file.totalLines = file.totalHits + file.totalMisses;
|
||||
cov.SLOC += file.SLOC = file.totalLines;
|
||||
cov.LOC += file.LOC = file.source.length;
|
||||
file.coverage = (file.totalHits / file.totalLines) * 100;
|
||||
// Source
|
||||
var width = file.source.length.toString().length;
|
||||
file.source = file.source.map(function(line, i){
|
||||
++i;
|
||||
var hits = file[i] === 0 ? 0 : (file[i] || ' ');
|
||||
if (!boring) {
|
||||
if (hits === 0) {
|
||||
hits = '\x1b[31m' + hits + '\x1b[0m';
|
||||
line = '\x1b[41m' + line + '\x1b[0m';
|
||||
} else {
|
||||
hits = '\x1b[32m' + hits + '\x1b[0m';
|
||||
}
|
||||
}
|
||||
return '\n ' + lpad(i, width) + ' | ' + hits + ' | ' + line;
|
||||
}).join('');
|
||||
}
|
||||
}
|
||||
cov.coverage = (cov.totalHits / cov.SLOC) * 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Total coverage for the given file data.
|
||||
*
|
||||
* @param {Array} data
|
||||
* @return {Type}
|
||||
*/
|
||||
|
||||
function coverage(data, val) {
|
||||
var n = 0;
|
||||
for (var i = 0, len = data.length; i < len; ++i) {
|
||||
if (data[i] !== undefined && data[i] == val) ++n;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given test `files`, or try _test/*_.
|
||||
*
|
||||
* @param {Array} files
|
||||
*/
|
||||
|
||||
function run(files) {
|
||||
if (!files.length) {
|
||||
try {
|
||||
files = fs.readdirSync('test').map(function(file){
|
||||
return 'test/' + file;
|
||||
});
|
||||
} catch (err) {
|
||||
print('\n failed to load tests in [bold]{./test}\n');
|
||||
++failures;
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
if (watch) watchFiles(files);
|
||||
runFiles(files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the cursor when `show` is true, otherwise hide it.
|
||||
*
|
||||
* @param {Boolean} show
|
||||
*/
|
||||
|
||||
function cursor(show) {
|
||||
if (show) {
|
||||
sys.print('\x1b[?25h');
|
||||
} else {
|
||||
sys.print('\x1b[?25l');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given test `files`.
|
||||
*
|
||||
* @param {Array} files
|
||||
*/
|
||||
|
||||
function runFiles(files) {
|
||||
files.forEach(runFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run tests for the given `file`.
|
||||
*
|
||||
* @param {String} file
|
||||
*/
|
||||
|
||||
function runFile(file) {
|
||||
if (file.match(/\.js$/)) {
|
||||
var title = path.basename(file),
|
||||
file = path.join(cwd, file),
|
||||
mod = require(file.replace(/\.js$/, ''));
|
||||
(function check(){
|
||||
var len = Object.keys(mod).length;
|
||||
if (len) {
|
||||
runSuite(title, mod);
|
||||
} else {
|
||||
setTimeout(check, 20);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the module cache for the given `file`.
|
||||
*
|
||||
* @param {String} file
|
||||
*/
|
||||
|
||||
function clearCache(file) {
|
||||
var keys = Object.keys(module.moduleCache);
|
||||
for (var i = 0, len = keys.length; i < len; ++i) {
|
||||
var key = keys[i];
|
||||
if (key.indexOf(file) === key.length - file.length) {
|
||||
delete module.moduleCache[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Watch the given `files` for changes.
|
||||
*
|
||||
* @param {Array} files
|
||||
*/
|
||||
|
||||
function watchFiles(files) {
|
||||
var p = 0,
|
||||
c = ['▫ ', '▫▫ ', '▫▫▫ ', ' ▫▫▫',
|
||||
' ▫▫', ' ▫', ' ▫', ' ▫▫',
|
||||
'▫▫▫ ', '▫▫ ', '▫ '],
|
||||
l = c.length;
|
||||
cursor(false);
|
||||
setInterval(function(){
|
||||
sys.print(colorize(' [green]{' + c[p++ % l] + '} watching\r'));
|
||||
}, 100);
|
||||
files.forEach(function(file){
|
||||
fs.watchFile(file, { interval: 100 }, function(curr, prev){
|
||||
if (curr.mtime > prev.mtime) {
|
||||
print(' [yellow]{◦} ' + file);
|
||||
clearCache(file);
|
||||
runFile(file);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Report `err` for the given `test` and `suite`.
|
||||
*
|
||||
* @param {String} suite
|
||||
* @param {String} test
|
||||
* @param {Error} err
|
||||
*/
|
||||
|
||||
function error(suite, test, err) {
|
||||
++failures;
|
||||
var name = err.name,
|
||||
stack = err.stack.replace(err.name, ''),
|
||||
label = test === 'uncaught'
|
||||
? test
|
||||
: suite + ' ' + test;
|
||||
print('\n [bold]{' + label + '}: [red]{' + name + '}' + stack + '\n');
|
||||
if (watch) notify(label + ' failed');
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given tests.
|
||||
*
|
||||
* @param {String} title
|
||||
* @param {Object} tests
|
||||
*/
|
||||
|
||||
function runSuite(title, tests) {
|
||||
var keys = only.length
|
||||
? only.slice(0)
|
||||
: Object.keys(tests);
|
||||
(function next(){
|
||||
if (keys.length) {
|
||||
var key,
|
||||
test = tests[key = keys.shift()];
|
||||
if (test) {
|
||||
try {
|
||||
++testcount;
|
||||
assert.testTitle = key;
|
||||
test(assert, function(fn){
|
||||
process.addListener('beforeExit', function(){
|
||||
try {
|
||||
fn();
|
||||
} catch (err) {
|
||||
error(title, key, err);
|
||||
}
|
||||
});
|
||||
});
|
||||
} catch (err) {
|
||||
error(title, key, err);
|
||||
}
|
||||
}
|
||||
next();
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
/**
|
||||
* Report exceptions.
|
||||
*/
|
||||
|
||||
function report() {
|
||||
process.emit('beforeExit');
|
||||
if (failures) {
|
||||
print('\n [bold]{Failures}: [red]{' + failures + '}\n\n');
|
||||
notify('Failures: ' + failures);
|
||||
} else {
|
||||
print('\n [green]{100%} ' + testcount + ' tests\n');
|
||||
notify('100% ok');
|
||||
}
|
||||
if (typeof _$jscoverage === 'object') {
|
||||
reportCoverage(_$jscoverage);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Growl notify the given `msg`.
|
||||
*
|
||||
* @param {String} msg
|
||||
*/
|
||||
|
||||
function notify(msg) {
|
||||
if (growl) {
|
||||
childProcess.exec('growlnotify -name Expresso -m "' + msg + '"');
|
||||
}
|
||||
}
|
||||
|
||||
// Report uncaught exceptions
|
||||
|
||||
process.addListener('uncaughtException', function(err){
|
||||
error('uncaught', 'uncaught', err);
|
||||
});
|
||||
|
||||
// Show cursor
|
||||
|
||||
['INT', 'TERM', 'QUIT'].forEach(function(sig){
|
||||
process.addListener('SIG' + sig, function(){
|
||||
cursor(true);
|
||||
process.exit(1);
|
||||
});
|
||||
});
|
||||
|
||||
// Report test coverage when available
|
||||
// and emit "beforeExit" event to perform
|
||||
// final assertions
|
||||
|
||||
var orig = process.emit;
|
||||
process.emit = function(event){
|
||||
if (event === 'exit') {
|
||||
report();
|
||||
process.reallyExit(failures);
|
||||
}
|
||||
orig.apply(this, arguments);
|
||||
};
|
||||
|
||||
// Run test files
|
||||
|
||||
if (!defer) run(files);
|
||||
989
node_modules/ejs/support/expresso/docs/api.html
generated
vendored
Normal file
989
node_modules/ejs/support/expresso/docs/api.html
generated
vendored
Normal file
@ -0,0 +1,989 @@
|
||||
<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>
|
||||
<head>
|
||||
<title>Expresso</title>
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
|
||||
<style>body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font: 14px/1.5 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
|
||||
color: #252519;
|
||||
}
|
||||
a {
|
||||
color: #252519;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
color: #19469D;
|
||||
}
|
||||
p {
|
||||
margin: 12px 0;
|
||||
}
|
||||
h1, h2, h3 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
table#source {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table#source td:first-child {
|
||||
padding: 30px 40px 30px 40px;
|
||||
vertical-align: top;
|
||||
}
|
||||
table#source td:first-child,
|
||||
table#source td:first-child pre {
|
||||
width: 450px;
|
||||
}
|
||||
table#source td:last-child {
|
||||
padding: 30px 0 30px 40px;
|
||||
border-left: 1px solid #E5E5EE;
|
||||
background: #F5F5FF;
|
||||
}
|
||||
table#source tr {
|
||||
border-bottom: 1px solid #E5E5EE;
|
||||
}
|
||||
table#source tr.filename {
|
||||
padding-top: 40px;
|
||||
border-top: 1px solid #E5E5EE;
|
||||
}
|
||||
table#source tr.filename td:first-child {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
table#source tr.filename td:last-child {
|
||||
font-size: 12px;
|
||||
}
|
||||
table#source tr.filename h2 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
table#source tr.code h1,
|
||||
table#source tr.code h2,
|
||||
table#source tr.code h3 {
|
||||
margin-top: 30px;
|
||||
font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
|
||||
font-size: 18px;
|
||||
}
|
||||
table#source tr.code h2 {
|
||||
font-size: 16px;
|
||||
}
|
||||
table#source tr.code h3 {
|
||||
font-size: 14px;
|
||||
}
|
||||
table#source tr.code ul {
|
||||
margin: 15px 0 15px 35px;
|
||||
padding: 0;
|
||||
}
|
||||
table#source tr.code ul li {
|
||||
margin: 0;
|
||||
padding: 1px 0;
|
||||
}
|
||||
table#source tr.code ul li p {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
table#source tr.code td:first-child pre {
|
||||
padding: 20px;
|
||||
}
|
||||
#ribbon {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
code .string { color: #219161; }
|
||||
code .regexp { color: #219161; }
|
||||
code .keyword { color: #954121; }
|
||||
code .number { color: #19469D; }
|
||||
code .comment { color: #bbb; }
|
||||
code .this { color: #19469D; }</style>
|
||||
<script>
|
||||
$(function(){
|
||||
$('tr.code').hide();
|
||||
$('tr.filename').toggle(function(){
|
||||
$(this).nextUntil('.filename').fadeIn();
|
||||
}, function(){
|
||||
$(this).nextUntil('.filename').fadeOut();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<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">
|
||||
<td class="docs">
|
||||
<h1>!/usr/bin/env node</h1>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code>!
|
||||
* <span class="class">Expresso</span>
|
||||
* <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>;
|
||||
* (<span class="class">MIT</span> <span class="class">Licensed</span>)
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Module dependencies.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">assert</span> = <span class="variable">require</span>(<span class="string">'assert'</span>),
|
||||
<span class="variable">childProcess</span> = <span class="variable">require</span>(<span class="string">'child_process'</span>),
|
||||
<span class="variable">http</span> = <span class="variable">require</span>(<span class="string">'http'</span>),
|
||||
<span class="variable">path</span> = <span class="variable">require</span>(<span class="string">'path'</span>),
|
||||
<span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
|
||||
<span class="variable">cwd</span> = <span class="variable">process</span>.<span class="variable">cwd</span>(),
|
||||
<span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>),
|
||||
<span class="variable">defer</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Expresso version.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">version</span> = <span class="string">'0.6.0'</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Failure count.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">failures</span> = <span class="number integer">0</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Whitelist of tests to run.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">only</span> = [];</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Boring output.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">boring</span> = <span class="variable">false</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Growl notifications.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">growl</span> = <span class="variable">false</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Server port.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">port</span> = <span class="number integer">5555</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Watch mode.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">watch</span> = <span class="variable">false</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Usage documentation.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">var</span> <span class="variable">usage</span> = <span class="string">''</span>
|
||||
+ <span class="string">'[bold]{Usage}: expresso [options] <file ...>'</span>
|
||||
+ <span class="string">'\n'</span>
|
||||
+ <span class="string">'\n[bold]{Options}:'</span>
|
||||
+ <span class="string">'\n -w, --watch Watch for modifications and re-execute tests'</span>
|
||||
+ <span class="string">'\n -g, --growl Enable growl notifications'</span>
|
||||
+ <span class="string">'\n -c, --coverage Generate and report test coverage'</span>
|
||||
+ <span class="string">'\n -r, --require PATH Require the given module path'</span>
|
||||
+ <span class="string">'\n -o, --only TESTS Execute only the comma sperated TESTS (can be set several times)'</span>
|
||||
+ <span class="string">'\n -I, --include PATH Unshift the given path to require.paths'</span>
|
||||
+ <span class="string">'\n -p, --port NUM Port number for test servers, starts at 5555'</span>
|
||||
+ <span class="string">'\n -b, --boring Suppress ansi-escape colors'</span>
|
||||
+ <span class="string">'\n -v, --version Output version number'</span>
|
||||
+ <span class="string">'\n -h, --help Display help information'</span>
|
||||
+ <span class="string">'\n'</span>;
|
||||
|
||||
<span class="comment">// Parse arguments</span>
|
||||
|
||||
<span class="keyword">var</span> <span class="variable">files</span> = [],
|
||||
<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>);
|
||||
|
||||
<span class="keyword">while</span> (<span class="variable">args</span>.<span class="variable">length</span>) {
|
||||
<span class="keyword">var</span> <span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>();
|
||||
<span class="keyword">switch</span> (<span class="variable">arg</span>) {
|
||||
<span class="keyword">case</span> <span class="string">'-h'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--help'</span>:
|
||||
<span class="variable">print</span>(<span class="variable">usage</span> + <span class="string">'\n'</span>);
|
||||
<span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-v'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--version'</span>:
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">version</span>);
|
||||
<span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-i'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'-I'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--include'</span>:
|
||||
<span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
|
||||
<span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="variable">arg</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--include requires a path'</span>);
|
||||
}
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-o'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--only'</span>:
|
||||
<span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
|
||||
<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>));
|
||||
} <span class="keyword">else</span> {
|
||||
<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>);
|
||||
}
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-p'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--port'</span>:
|
||||
<span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
|
||||
<span class="variable">port</span> = <span class="variable">parseInt</span>(<span class="variable">arg</span>, <span class="number integer">10</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--port requires a number'</span>);
|
||||
}
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-r'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--require'</span>:
|
||||
<span class="keyword">if</span> (<span class="variable">arg</span> = <span class="variable">args</span>.<span class="variable">shift</span>()) {
|
||||
<span class="variable">require</span>(<span class="variable">arg</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'--require requires a path'</span>);
|
||||
}
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-c'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--cov'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--coverage'</span>:
|
||||
<span class="variable">defer</span> = <span class="variable">true</span>;
|
||||
<span class="variable">childProcess</span>.<span class="variable">exec</span>(<span class="string">'rm -fr lib-cov && node-jscoverage lib lib-cov'</span>, <span class="keyword">function</span>(<span class="variable">err</span>){
|
||||
<span class="keyword">if</span> (<span class="variable">err</span>) <span class="keyword">throw</span> <span class="variable">err</span>;
|
||||
<span class="variable">require</span>.<span class="variable">paths</span>.<span class="variable">unshift</span>(<span class="string">'lib-cov'</span>);
|
||||
<span class="variable">run</span>(<span class="variable">files</span>);
|
||||
})
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-b'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--boring'</span>:
|
||||
<span class="variable">boring</span> = <span class="variable">true</span>;
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'-w'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--watch'</span>:
|
||||
<span class="variable">watch</span> = <span class="variable">true</span>;
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">case</span> <span class="string">'--g'</span>:
|
||||
<span class="keyword">case</span> <span class="string">'--growl'</span>:
|
||||
<span class="variable">growl</span> = <span class="variable">true</span>;
|
||||
<span class="keyword">break</span>;
|
||||
<span class="keyword">default</span>:
|
||||
<span class="keyword">if</span> (<span class="regexp">/\.js$/</span>.<span class="variable">test</span>(<span class="variable">arg</span>)) {
|
||||
<span class="variable">files</span>.<span class="variable">push</span>(<span class="variable">arg</span>);
|
||||
}
|
||||
<span class="keyword">break</span>;
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Colorized sys.error().</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> str</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">print</span>(<span class="variable">str</span>){
|
||||
<span class="variable">sys</span>.<span class="variable">error</span>(<span class="variable">colorize</span>(<span class="variable">str</span>));
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Colorize the given string using ansi-escape sequences.
|
||||
Disabled when --boring is set.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> str</p></li><li><p><strong>return</strong>: <em>String</em> </p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">colorize</span>(<span class="variable">str</span>){
|
||||
<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> };
|
||||
<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>){
|
||||
<span class="keyword">return</span> <span class="variable">boring</span>
|
||||
? <span class="variable">str</span>
|
||||
: <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>;
|
||||
});
|
||||
}
|
||||
|
||||
<span class="comment">// Alias deepEqual as eql for complex equality</span>
|
||||
|
||||
<span class="variable">assert</span>.<span class="variable">eql</span> = <span class="variable">assert</span>.<span class="variable">deepEqual</span>;</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>val</code> is null.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>val</code> is not null.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>val</code> is undefined.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>val</code> is not undefined.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Mixed</em> val</p></li><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>obj</code> is <code>type</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>){
|
||||
<span class="keyword">var</span> <span class="variable">real</span> = <span class="keyword">typeof</span> <span class="variable">obj</span>;
|
||||
<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>;
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>str</code> matches <code>regexp</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert that <code>val</code> is within <code>obj</code>.</p>
|
||||
|
||||
<h2>Examples</h2>
|
||||
|
||||
<p> assert.includes('foobar', 'bar');
|
||||
assert.includes(['foo', 'bar'], 'foo');</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>);
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert length of <code>val</code> is <code>n</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
<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>;
|
||||
<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>);
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Assert response from <code>server</code> with
|
||||
the given <code>req</code> object and <code>res</code> assertions object.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>){
|
||||
<span class="comment">// Callback as third or fourth arg</span>
|
||||
<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>
|
||||
? <span class="variable">res</span>
|
||||
: <span class="keyword">typeof</span> <span class="variable">msg</span> === <span class="string">'function'</span>
|
||||
? <span class="variable">msg</span>
|
||||
: <span class="keyword">function</span>(){};
|
||||
|
||||
<span class="comment">// Default messate to test title</span>
|
||||
<span class="variable">msg</span> = <span class="variable">msg</span> || <span class="variable">assert</span>.<span class="variable">testTitle</span>;
|
||||
<span class="variable">msg</span> += <span class="string">'. '</span>;
|
||||
|
||||
<span class="comment">// Pending responses</span>
|
||||
<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>;
|
||||
<span class="variable">server</span>.<span class="variable">__pending</span>++;
|
||||
|
||||
<span class="comment">// Create client</span>
|
||||
<span class="keyword">if</span> (!<span class="variable">server</span>.<span class="variable">fd</span>) {
|
||||
<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="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>);
|
||||
}
|
||||
|
||||
<span class="comment">// Issue request</span>
|
||||
<span class="keyword">var</span> <span class="variable">timer</span>,
|
||||
<span class="variable">client</span> = <span class="variable">server</span>.<span class="variable">client</span>,
|
||||
<span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">method</span> || <span class="string">'GET'</span>,
|
||||
<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>,
|
||||
<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>,
|
||||
<span class="variable">timeout</span> = <span class="variable">req</span>.<span class="variable">timeout</span> || <span class="number integer">0</span>;
|
||||
|
||||
<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>);
|
||||
|
||||
<span class="comment">// Timeout</span>
|
||||
<span class="keyword">if</span> (<span class="variable">timeout</span>) {
|
||||
<span class="variable">timer</span> = <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){
|
||||
--<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
|
||||
<span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">timeout</span>;
|
||||
<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">timeout</span> + <span class="string">'ms.'</span>);
|
||||
}, <span class="variable">timeout</span>);
|
||||
}
|
||||
|
||||
<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>);
|
||||
<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>){
|
||||
<span class="variable">response</span>.<span class="variable">body</span> = <span class="string">''</span>;
|
||||
<span class="variable">response</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>);
|
||||
<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>; });
|
||||
<span class="variable">response</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>(){
|
||||
--<span class="variable">server</span>.<span class="variable">__pending</span> || <span class="variable">server</span>.<span class="variable">close</span>();
|
||||
<span class="keyword">if</span> (<span class="variable">timer</span>) <span class="variable">clearTimeout</span>(<span class="variable">timer</span>);
|
||||
|
||||
<span class="comment">// Assert response body</span>
|
||||
<span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">body</span> !== <span class="variable">undefined</span>) {
|
||||
<span class="variable">assert</span>.<span class="variable">equal</span>(
|
||||
<span class="variable">response</span>.<span class="variable">body</span>,
|
||||
<span class="variable">res</span>.<span class="variable">body</span>,
|
||||
<span class="variable">msg</span> + <span class="string">'Invalid response body.\n'</span>
|
||||
+ <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>
|
||||
+ <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>)
|
||||
);
|
||||
}
|
||||
|
||||
<span class="comment">// Assert response status</span>
|
||||
<span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">status</span> === <span class="string">'number'</span>) {
|
||||
<span class="variable">assert</span>.<span class="variable">equal</span>(
|
||||
<span class="variable">response</span>.<span class="variable">statusCode</span>,
|
||||
<span class="variable">status</span>,
|
||||
<span class="variable">msg</span> + <span class="variable">colorize</span>(<span class="string">'Invalid response status code.\n'</span>
|
||||
+ <span class="string">' Expected: [green]{'</span> + <span class="variable">status</span> + <span class="string">'}\n'</span>
|
||||
+ <span class="string">' Got: [red]{'</span> + <span class="variable">response</span>.<span class="variable">statusCode</span> + <span class="string">'}'</span>)
|
||||
);
|
||||
}
|
||||
|
||||
<span class="comment">// Assert response headers</span>
|
||||
<span class="keyword">if</span> (<span class="variable">res</span>.<span class="variable">headers</span>) {
|
||||
<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>);
|
||||
<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>) {
|
||||
<span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">keys</span>[<span class="variable">i</span>],
|
||||
<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>()],
|
||||
<span class="variable">expected</span> = <span class="variable">res</span>.<span class="variable">headers</span>[<span class="variable">name</span>];
|
||||
<span class="variable">assert</span>.<span class="variable">equal</span>(
|
||||
<span class="variable">actual</span>,
|
||||
<span class="variable">expected</span>,
|
||||
<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>
|
||||
+ <span class="string">' Expected: [green]{'</span> + <span class="variable">expected</span> + <span class="string">'}\n'</span>
|
||||
+ <span class="string">' Got: [red]{'</span> + <span class="variable">actual</span> + <span class="string">'}'</span>)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
<span class="comment">// Callback</span>
|
||||
<span class="variable">callback</span>(<span class="variable">response</span>);
|
||||
});
|
||||
});
|
||||
<span class="variable">request</span>.<span class="variable">end</span>();
|
||||
};</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Pad the given string to the maximum width provided.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">lpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
|
||||
<span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
|
||||
<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>;
|
||||
<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>;
|
||||
<span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="string">' '</span> + <span class="variable">str</span>;
|
||||
<span class="keyword">return</span> <span class="variable">str</span>;
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Pad the given string to the maximum width provided.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">rpad</span>(<span class="variable">str</span>, <span class="variable">width</span>) {
|
||||
<span class="variable">str</span> = <span class="class">String</span>(<span class="variable">str</span>);
|
||||
<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>;
|
||||
<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>;
|
||||
<span class="keyword">while</span> (<span class="variable">n</span>--) <span class="variable">str</span> = <span class="variable">str</span> + <span class="string">' '</span>;
|
||||
<span class="keyword">return</span> <span class="variable">str</span>;
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Report test coverage.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Object</em> cov</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">reportCoverage</span>(<span class="variable">cov</span>) {
|
||||
<span class="variable">populateCoverage</span>(<span class="variable">cov</span>);
|
||||
<span class="comment">// Stats</span>
|
||||
<span class="variable">print</span>(<span class="string">'\n [bold]{Test Coverage}\n'</span>);
|
||||
<span class="keyword">var</span> <span class="variable">sep</span> = <span class="string">' +------------------------------------------+----------+------+------+--------+'</span>,
|
||||
<span class="variable">lastSep</span> = <span class="string">' +----------+------+------+--------+'</span>;
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="string">' | filename | coverage | LOC | SLOC | missed |'</span>);
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
|
||||
<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>) {
|
||||
<span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
|
||||
<span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
|
||||
}
|
||||
}
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">sep</span>);
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<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>));
|
||||
<span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">' |\n'</span>);
|
||||
<span class="variable">sys</span>.<span class="variable">puts</span>(<span class="variable">lastSep</span>);
|
||||
<span class="comment">// Source</span>
|
||||
<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>) {
|
||||
<span class="keyword">if</span> (<span class="variable">name</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
|
||||
<span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
|
||||
<span class="variable">print</span>(<span class="string">'\n [bold]{'</span> + <span class="variable">name</span> + <span class="string">'}:'</span>);
|
||||
<span class="variable">print</span>(<span class="variable">file</span>.<span class="variable">source</span>);
|
||||
<span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\n'</span>);
|
||||
}
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Populate code coverage data.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Object</em> cov</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">populateCoverage</span>(<span class="variable">cov</span>) {
|
||||
<span class="variable">cov</span>.<span class="class">LOC</span> =
|
||||
<span class="variable">cov</span>.<span class="class">SLOC</span> =
|
||||
<span class="variable">cov</span>.<span class="variable">totalFiles</span> =
|
||||
<span class="variable">cov</span>.<span class="variable">totalHits</span> =
|
||||
<span class="variable">cov</span>.<span class="variable">totalMisses</span> =
|
||||
<span class="variable">cov</span>.<span class="variable">coverage</span> = <span class="number integer">0</span>;
|
||||
<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>) {
|
||||
<span class="keyword">var</span> <span class="variable">file</span> = <span class="variable">cov</span>[<span class="variable">name</span>];
|
||||
<span class="keyword">if</span> (<span class="class">Array</span>.<span class="variable">isArray</span>(<span class="variable">file</span>)) {
|
||||
<span class="comment">// Stats</span>
|
||||
++<span class="variable">cov</span>.<span class="variable">totalFiles</span>;
|
||||
<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>);
|
||||
<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>);
|
||||
<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>;
|
||||
<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>;
|
||||
<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>;
|
||||
<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>;
|
||||
<span class="comment">// Source</span>
|
||||
<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>;
|
||||
<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>){
|
||||
++<span class="variable">i</span>;
|
||||
<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>);
|
||||
<span class="keyword">if</span> (!<span class="variable">boring</span>) {
|
||||
<span class="keyword">if</span> (<span class="variable">hits</span> === <span class="number integer">0</span>) {
|
||||
<span class="variable">hits</span> = <span class="string">'\x1b[31m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
|
||||
<span class="variable">line</span> = <span class="string">'\x1b[41m'</span> + <span class="variable">line</span> + <span class="string">'\x1b[0m'</span>;
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="variable">hits</span> = <span class="string">'\x1b[32m'</span> + <span class="variable">hits</span> + <span class="string">'\x1b[0m'</span>;
|
||||
}
|
||||
}
|
||||
<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>;
|
||||
}).<span class="variable">join</span>(<span class="string">''</span>);
|
||||
}
|
||||
}
|
||||
<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>;
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Total coverage for the given file data.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Array</em> data</p></li><li><p><strong>return</strong>: <em>Type</em> </p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">coverage</span>(<span class="variable">data</span>, <span class="variable">val</span>) {
|
||||
<span class="keyword">var</span> <span class="variable">n</span> = <span class="number integer">0</span>;
|
||||
<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>) {
|
||||
<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>;
|
||||
}
|
||||
<span class="keyword">return</span> <span class="variable">n</span>;
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Run the given test <code>files</code>, or try <em>test/*</em>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">run</span>(<span class="variable">files</span>) {
|
||||
<span class="keyword">if</span> (!<span class="variable">files</span>.<span class="variable">length</span>) {
|
||||
<span class="keyword">try</span> {
|
||||
<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>){
|
||||
<span class="keyword">return</span> <span class="string">'test/'</span> + <span class="variable">file</span>;
|
||||
});
|
||||
} <span class="keyword">catch</span> (<span class="variable">err</span>) {
|
||||
<span class="variable">print</span>(<span class="string">'\n failed to load tests in [bold]{./test}\n'</span>);
|
||||
++<span class="variable">failures</span>;
|
||||
<span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
|
||||
}
|
||||
}
|
||||
<span class="keyword">if</span> (<span class="variable">watch</span>) <span class="variable">watchFiles</span>(<span class="variable">files</span>);
|
||||
<span class="variable">runFiles</span>(<span class="variable">files</span>);
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Show the cursor when <code>show</code> is true, otherwise hide it.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Boolean</em> show</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">cursor</span>(<span class="variable">show</span>) {
|
||||
<span class="keyword">if</span> (<span class="variable">show</span>) {
|
||||
<span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25h'</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="variable">sys</span>.<span class="variable">print</span>(<span class="string">'\x1b[?25l'</span>);
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Run the given test <code>files</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">runFiles</span>(<span class="variable">files</span>) {
|
||||
<span class="variable">files</span>.<span class="variable">forEach</span>(<span class="variable">runFile</span>);
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Run tests for the given <code>file</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> file</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">runFile</span>(<span class="variable">file</span>) {
|
||||
<span class="keyword">if</span> (<span class="variable">file</span>.<span class="variable">match</span>(<span class="regexp">/\.js$/</span>)) {
|
||||
<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>),
|
||||
<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>),
|
||||
<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>));
|
||||
(<span class="keyword">function</span> <span class="variable">check</span>(){
|
||||
<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>;
|
||||
<span class="keyword">if</span> (<span class="variable">len</span>) {
|
||||
<span class="variable">runSuite</span>(<span class="variable">title</span>, <span class="variable">mod</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="variable">setTimeout</span>(<span class="variable">check</span>, <span class="number integer">20</span>);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Clear the module cache for the given <code>file</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> file</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">clearCache</span>(<span class="variable">file</span>) {
|
||||
<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>);
|
||||
<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>) {
|
||||
<span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">keys</span>[<span class="variable">i</span>];
|
||||
<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>) {
|
||||
<span class="keyword">delete</span> <span class="variable">module</span>.<span class="variable">moduleCache</span>[<span class="variable">key</span>];
|
||||
}
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Watch the given <code>files</code> for changes.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>Array</em> files</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">watchFiles</span>(<span class="variable">files</span>) {
|
||||
<span class="keyword">var</span> <span class="variable">p</span> = <span class="number integer">0</span>,
|
||||
<span class="variable">c</span> = [<span class="string">'▫ '</span>, <span class="string">'▫▫ '</span>, <span class="string">'▫▫▫ '</span>, <span class="string">' ▫▫▫'</span>,
|
||||
<span class="string">' ▫▫'</span>, <span class="string">' ▫'</span>, <span class="string">' ▫'</span>, <span class="string">' ▫▫'</span>,
|
||||
<span class="string">'▫▫▫ '</span>, <span class="string">'▫▫ '</span>, <span class="string">'▫ '</span>],
|
||||
<span class="variable">l</span> = <span class="variable">c</span>.<span class="variable">length</span>;
|
||||
<span class="variable">cursor</span>(<span class="variable">false</span>);
|
||||
<span class="variable">setInterval</span>(<span class="keyword">function</span>(){
|
||||
<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>));
|
||||
}, <span class="number integer">100</span>);
|
||||
<span class="variable">files</span>.<span class="variable">forEach</span>(<span class="keyword">function</span>(<span class="variable">file</span>){
|
||||
<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>){
|
||||
<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>) {
|
||||
<span class="variable">print</span>(<span class="string">' [yellow]{◦} '</span> + <span class="variable">file</span>);
|
||||
<span class="variable">clearCache</span>(<span class="variable">file</span>);
|
||||
<span class="variable">runFile</span>(<span class="variable">file</span>);
|
||||
}
|
||||
});
|
||||
});
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Report <code>err</code> for the given <code>test</code> and <code>suite</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<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>
|
||||
</td>
|
||||
<td class="code">
|
||||
<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>) {
|
||||
++<span class="variable">failures</span>;
|
||||
<span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">err</span>.<span class="variable">name</span>,
|
||||
<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>),
|
||||
<span class="keyword">label</span> = <span class="variable">test</span> === <span class="string">'uncaught'</span>
|
||||
? <span class="variable">test</span>
|
||||
: <span class="variable">suite</span> + <span class="string">' '</span> + <span class="variable">test</span>;
|
||||
<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>);
|
||||
<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>);
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Run the given tests.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> title</p></li><li><p><strong>param</strong>: <em>Object</em> tests</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">runSuite</span>(<span class="variable">title</span>, <span class="variable">tests</span>) {
|
||||
<span class="keyword">var</span> <span class="variable">keys</span> = <span class="variable">only</span>.<span class="variable">length</span>
|
||||
? <span class="variable">only</span>.<span class="variable">slice</span>(<span class="number integer">0</span>)
|
||||
: <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">tests</span>);
|
||||
(<span class="keyword">function</span> <span class="variable">next</span>(){
|
||||
<span class="keyword">if</span> (<span class="variable">keys</span>.<span class="variable">length</span>) {
|
||||
<span class="keyword">var</span> <span class="variable">key</span>,
|
||||
<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>()];
|
||||
<span class="keyword">if</span> (<span class="variable">test</span>) {
|
||||
<span class="keyword">try</span> {
|
||||
<span class="variable">assert</span>.<span class="variable">testTitle</span> = <span class="variable">key</span>;
|
||||
<span class="variable">test</span>(<span class="variable">assert</span>, <span class="keyword">function</span>(<span class="variable">fn</span>){
|
||||
<span class="variable">process</span>.<span class="variable">addListener</span>(<span class="string">'beforeExit'</span>, <span class="keyword">function</span>(){
|
||||
<span class="keyword">try</span> {
|
||||
<span class="variable">fn</span>();
|
||||
} <span class="keyword">catch</span> (<span class="variable">err</span>) {
|
||||
<span class="variable">error</span>(<span class="variable">title</span>, <span class="variable">key</span>, <span class="variable">err</span>);
|
||||
}
|
||||
});
|
||||
});
|
||||
} <span class="keyword">catch</span> (<span class="variable">err</span>) {
|
||||
<span class="variable">error</span>(<span class="variable">title</span>, <span class="variable">key</span>, <span class="variable">err</span>);
|
||||
}
|
||||
}
|
||||
<span class="variable">next</span>();
|
||||
}
|
||||
})();
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Report exceptions.
|
||||
</p>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">report</span>() {
|
||||
<span class="variable">process</span>.<span class="variable">emit</span>(<span class="string">'beforeExit'</span>);
|
||||
<span class="keyword">if</span> (<span class="variable">failures</span>) {
|
||||
<span class="variable">print</span>(<span class="string">'\n [bold]{Failures}: [red]{'</span> + <span class="variable">failures</span> + <span class="string">'}\n\n'</span>);
|
||||
<span class="variable">notify</span>(<span class="string">'Failures: '</span> + <span class="variable">failures</span>);
|
||||
} <span class="keyword">else</span> {
|
||||
<span class="variable">print</span>(<span class="string">'\n [green]{100%} ok\n'</span>);
|
||||
<span class="variable">notify</span>(<span class="string">'100% ok'</span>);
|
||||
}
|
||||
<span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">_</span>$<span class="variable">jscoverage</span> === <span class="string">'object'</span>) {
|
||||
<span class="variable">reportCoverage</span>(<span class="variable">_</span>$<span class="variable">jscoverage</span>);
|
||||
}
|
||||
}</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="code">
|
||||
<td class="docs">
|
||||
<p>Growl notify the given <code>msg</code>.</p>
|
||||
|
||||
<h2></h2>
|
||||
|
||||
<ul><li><p><strong>param</strong>: <em>String</em> msg</p></li></ul>
|
||||
</td>
|
||||
<td class="code">
|
||||
<pre><code><span class="keyword">function</span> <span class="variable">notify</span>(<span class="variable">msg</span>) {
|
||||
<span class="keyword">if</span> (<span class="variable">growl</span>) {
|
||||
<span class="variable">childProcess</span>.<span class="variable">exec</span>(<span class="string">'growlnotify -name Expresso -m "'</span> + <span class="variable">msg</span> + <span class="string">'"'</span>);
|
||||
}
|
||||
}
|
||||
|
||||
<span class="comment">// Report uncaught exceptions</span>
|
||||
|
||||
<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>){
|
||||
<span class="variable">error</span>(<span class="string">'uncaught'</span>, <span class="string">'uncaught'</span>, <span class="variable">err</span>);
|
||||
});
|
||||
|
||||
<span class="comment">// Show cursor</span>
|
||||
|
||||
[<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>){
|
||||
<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>(){
|
||||
<span class="variable">cursor</span>(<span class="variable">true</span>);
|
||||
<span class="variable">process</span>.<span class="variable">exit</span>(<span class="number integer">1</span>);
|
||||
});
|
||||
});
|
||||
|
||||
<span class="comment">// Report test coverage when available</span>
|
||||
<span class="comment">// and emit "beforeExit" event to perform</span>
|
||||
<span class="comment">// final assertions</span>
|
||||
|
||||
<span class="keyword">var</span> <span class="variable">orig</span> = <span class="variable">process</span>.<span class="variable">emit</span>;
|
||||
<span class="variable">process</span>.<span class="variable">emit</span> = <span class="keyword">function</span>(<span class="variable">event</span>){
|
||||
<span class="keyword">if</span> (<span class="variable">event</span> === <span class="string">'exit'</span>) {
|
||||
<span class="variable">report</span>();
|
||||
<span class="variable">process</span>.<span class="variable">reallyExit</span>(<span class="variable">failures</span>);
|
||||
}
|
||||
<span class="variable">orig</span>.<span class="variable">apply</span>(<span class="this">this</span>, <span class="variable">arguments</span>);
|
||||
};
|
||||
|
||||
<span class="comment">// Run test files</span>
|
||||
|
||||
<span class="keyword">if</span> (!<span class="variable">defer</span>) <span class="variable">run</span>(<span class="variable">files</span>);
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr> </body>
|
||||
</html></tbody></table>
|
||||
380
node_modules/ejs/support/expresso/docs/index.html
generated
vendored
Normal file
380
node_modules/ejs/support/expresso/docs/index.html
generated
vendored
Normal file
@ -0,0 +1,380 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Expresso - TDD Framework For Node</title>
|
||||
<style>
|
||||
body {
|
||||
font: 13px/1.4 "Helvetica", "Lucida Grande", Arial, sans-serif;
|
||||
}
|
||||
#header {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 0;
|
||||
padding: 14px 0 12px 0;
|
||||
text-indent: 40px;
|
||||
font-family: "Helvetica";
|
||||
width: 100%;
|
||||
border-top: 1px solid rgba(0,0,0,0.2);
|
||||
border-bottom: 1px solid rgba(0,0,0,0.2);
|
||||
background: rgba(255,255,255,0.6) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
|
||||
text-align: left;
|
||||
color: #888;
|
||||
}
|
||||
#ribbon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
#wrapper {
|
||||
padding: 80px;
|
||||
}
|
||||
h1, h2, h3 {
|
||||
margin: 25px 0 15px 0;
|
||||
}
|
||||
pre {
|
||||
margin: 0 5px;
|
||||
padding: 10px;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="http://github.com/visionmedia/expresso">
|
||||
<img alt="Fork me on GitHub" id="ribbon" src="http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" />
|
||||
</a>
|
||||
<div id="header"><strong>Sencha</strong> labs</div>
|
||||
<div id="wrapper">
|
||||
<h1>Expresso</h1>
|
||||
<div class='mp'>
|
||||
<p><a href="http://github.com/visionmedia/expresso">Expresso</a> is a JavaScript <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> framework written for <a href="http://nodejs.org">nodejs</a>. Expresso is extremely fast, and is packed with features such as additional assertion methods, code coverage reporting, CI support, and more.</p>
|
||||
|
||||
<h2 id="Features">Features</h2>
|
||||
|
||||
<ul>
|
||||
<li>light-weight</li>
|
||||
<li>intuitive async support</li>
|
||||
<li>intuitive test runner executable</li>
|
||||
<li>test coverage support and reporting via <a href="http://github.com/visionmedia/node-jscoverage">node-jscoverage</a></li>
|
||||
<li>uses and extends the core <em>assert</em> module</li>
|
||||
<li><code>assert.eql()</code> alias of <code>assert.deepEqual()</code></li>
|
||||
<li><code>assert.response()</code> http response utility</li>
|
||||
<li><code>assert.includes()</code></li>
|
||||
<li><code>assert.isNull()</code></li>
|
||||
<li><code>assert.isUndefined()</code></li>
|
||||
<li><code>assert.isNotNull()</code></li>
|
||||
<li><code>assert.isDefined()</code></li>
|
||||
<li><code>assert.match()</code></li>
|
||||
<li><code>assert.length()</code></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2 id="Installation">Installation</h2>
|
||||
|
||||
<p>To install both expresso <em>and</em> node-jscoverage run
|
||||
the command below, which will first compile node-jscoverage:</p>
|
||||
|
||||
<pre><code>$ make install
|
||||
</code></pre>
|
||||
|
||||
<p>To install expresso alone without coverage reporting run:</p>
|
||||
|
||||
<pre><code>$ make install-expresso
|
||||
</code></pre>
|
||||
|
||||
<p>Install via npm:</p>
|
||||
|
||||
<pre><code>$ npm install expresso
|
||||
</code></pre>
|
||||
|
||||
<h2 id="Examples">Examples</h2>
|
||||
|
||||
<h2 id="Examples">Examples</h2>
|
||||
|
||||
<p>To define tests we simply export several functions:</p>
|
||||
|
||||
<pre><code>exports['test String#length'] = function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
<p>Alternatively for large numbers of tests you may want to
|
||||
export your own object containing the tests, however this
|
||||
is essentially the as above:</p>
|
||||
|
||||
<pre><code>module.exports = {
|
||||
'test String#length': function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
}
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
<p>If you prefer not to use quoted keys:</p>
|
||||
|
||||
<pre><code>exports.testsStringLength = function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
<p>The second argument passed to each callback is <em>beforeExit</em>,
|
||||
which is typically used to assert that callbacks have been
|
||||
invoked.</p>
|
||||
|
||||
<pre><code>exports.testAsync = function(assert, beforeExit){
|
||||
var n = 0;
|
||||
setTimeout(function(){
|
||||
++n;
|
||||
assert.ok(true);
|
||||
}, 200);
|
||||
setTimeout(function(){
|
||||
++n;
|
||||
assert.ok(true);
|
||||
}, 200);
|
||||
beforeExit(function(){
|
||||
assert.equal(2, n, 'Ensure both timeouts are called');
|
||||
});
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
<h2 id="Assert-Utilities">Assert Utilities</h2>
|
||||
|
||||
<h3 id="assert-isNull-val-msg-">assert.isNull(val[, msg])</h3>
|
||||
|
||||
<p>Asserts that the given <em>val</em> is <em>null</em>.</p>
|
||||
|
||||
<pre><code>assert.isNull(null);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-isNotNull-val-msg-">assert.isNotNull(val[, msg])</h3>
|
||||
|
||||
<p>Asserts that the given <em>val</em> is not <em>null</em>.</p>
|
||||
|
||||
<pre><code>assert.isNotNull(undefined);
|
||||
assert.isNotNull(false);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-isUndefined-val-msg-">assert.isUndefined(val[, msg])</h3>
|
||||
|
||||
<p>Asserts that the given <em>val</em> is <em>undefined</em>.</p>
|
||||
|
||||
<pre><code>assert.isUndefined(undefined);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-isDefined-val-msg-">assert.isDefined(val[, msg])</h3>
|
||||
|
||||
<p>Asserts that the given <em>val</em> is not <em>undefined</em>.</p>
|
||||
|
||||
<pre><code>assert.isDefined(null);
|
||||
assert.isDefined(false);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-match-str-regexp-msg-">assert.match(str, regexp[, msg])</h3>
|
||||
|
||||
<p>Asserts that the given <em>str</em> matches <em>regexp</em>.</p>
|
||||
|
||||
<pre><code>assert.match('foobar', /^foo(bar)?/);
|
||||
assert.match('foo', /^foo(bar)?/);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-length-val-n-msg-">assert.length(val, n[, msg])</h3>
|
||||
|
||||
<p>Assert that the given <em>val</em> has a length of <em>n</em>.</p>
|
||||
|
||||
<pre><code>assert.length([1,2,3], 3);
|
||||
assert.length('foo', 3);
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-type-obj-type-msg-">assert.type(obj, type[, msg])</h3>
|
||||
|
||||
<p>Assert that the given <em>obj</em> is typeof <em>type</em>.</p>
|
||||
|
||||
<pre><code>assert.type(3, 'number');
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-eql-a-b-msg-">assert.eql(a, b[, msg])</h3>
|
||||
|
||||
<p>Assert that object <em>b</em> is equal to object <em>a</em>. This is an
|
||||
alias for the core <em>assert.deepEqual()</em> method which does complex
|
||||
comparisons, opposed to <em>assert.equal()</em> which uses <em>==</em>.</p>
|
||||
|
||||
<pre><code>assert.eql('foo', 'foo');
|
||||
assert.eql([1,2], [1,2]);
|
||||
assert.eql({ foo: 'bar' }, { foo: 'bar' });
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-includes-obj-val-msg-">assert.includes(obj, val[, msg])</h3>
|
||||
|
||||
<p>Assert that <em>obj</em> is within <em>val</em>. This method supports <em>Array_s
|
||||
and </em>Strings_s.</p>
|
||||
|
||||
<pre><code>assert.includes([1,2,3], 3);
|
||||
assert.includes('foobar', 'foo');
|
||||
assert.includes('foobar', 'bar');
|
||||
</code></pre>
|
||||
|
||||
<h3 id="assert-response-server-req-res-fn-msg-fn-">assert.response(server, req, res|fn[, msg|fn])</h3>
|
||||
|
||||
<p>Performs assertions on the given <em>server</em>, which should <em>not</em> call
|
||||
listen(), as this is handled internally by expresso and the server
|
||||
is killed after all responses have completed. This method works with
|
||||
any <em>http.Server</em> instance, so <em>Connect</em> and <em>Express</em> servers will work
|
||||
as well.</p>
|
||||
|
||||
<p>The <em>req</em> object may contain:</p>
|
||||
|
||||
<ul>
|
||||
<li><em>url</em> request url</li>
|
||||
<li><em>timeout</em> timeout in milliseconds</li>
|
||||
<li><em>method</em> HTTP method</li>
|
||||
<li><em>data</em> request body</li>
|
||||
<li><em>headers</em> headers object</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p>The <em>res</em> object may be a callback function which
|
||||
receives the response for assertions, or an object
|
||||
which is then used to perform several assertions
|
||||
on the response with the following properties:</p>
|
||||
|
||||
<ul>
|
||||
<li><em>body</em> assert response body</li>
|
||||
<li><em>status</em> assert response status code</li>
|
||||
<li><em>header</em> assert that all given headers match (unspecified are ignored)</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p>When providing <em>res</em> you may then also pass a callback function
|
||||
as the fourth argument for additional assertions.</p>
|
||||
|
||||
<p>Below are some examples:</p>
|
||||
|
||||
<pre><code>assert.response(server, {
|
||||
url: '/', timeout: 500
|
||||
}, {
|
||||
body: 'foobar'
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/',
|
||||
method: 'GET'
|
||||
},{
|
||||
body: '{"name":"tj"}',
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf8',
|
||||
'X-Foo': 'bar'
|
||||
}
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo',
|
||||
method: 'POST',
|
||||
data: 'bar baz'
|
||||
},{
|
||||
body: '/foo bar baz',
|
||||
status: 200
|
||||
}, 'Test POST');
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo',
|
||||
method: 'POST',
|
||||
data: 'bar baz'
|
||||
},{
|
||||
body: '/foo bar baz',
|
||||
status: 200
|
||||
}, function(res){
|
||||
// All done, do some more tests if needed
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/'
|
||||
}, function(res){
|
||||
assert.ok(res.body.indexOf('tj') >= 0, 'Test assert.response() callback');
|
||||
});
|
||||
</code></pre>
|
||||
|
||||
<h2 id="expresso-1-">expresso(1)</h2>
|
||||
|
||||
<p>To run a single test suite (file) run:</p>
|
||||
|
||||
<pre><code>$ expresso test/a.test.js
|
||||
</code></pre>
|
||||
|
||||
<p>To run several suites we may simply append another:</p>
|
||||
|
||||
<pre><code>$ expresso test/a.test.js test/b.test.js
|
||||
</code></pre>
|
||||
|
||||
<p>We can also pass a whitelist of tests to run within all suites:</p>
|
||||
|
||||
<pre><code>$ expresso --only "foo()" --only "bar()"
|
||||
</code></pre>
|
||||
|
||||
<p>Or several with one call:</p>
|
||||
|
||||
<pre><code>$ expresso --only "foo(), bar()"
|
||||
</code></pre>
|
||||
|
||||
<p>Globbing is of course possible as well:</p>
|
||||
|
||||
<pre><code>$ expresso test/*
|
||||
</code></pre>
|
||||
|
||||
<p>When expresso is called without any files, <em>test/*</em> is the default,
|
||||
so the following is equivalent to the command above:</p>
|
||||
|
||||
<pre><code>$ expresso
|
||||
</code></pre>
|
||||
|
||||
<p>If you wish to unshift a path to <code>require.paths</code> before
|
||||
running tests, you may use the <code>-I</code> or <code>--include</code> flag.</p>
|
||||
|
||||
<pre><code>$ expresso --include lib test/*
|
||||
</code></pre>
|
||||
|
||||
<p>The previous example is typically what I would recommend, since expresso
|
||||
supports test coverage via <a href="http://github.com/visionmedia/node-jscoverage">node-jscoverage</a> (bundled with expresso),
|
||||
so you will need to expose an instrumented version of you library.</p>
|
||||
|
||||
<p>To instrument your library, simply run <a href="http://github.com/visionmedia/node-jscoverage">node-jscoverage</a>,
|
||||
passing the <em>src</em> and <em>dest</em> directories:</p>
|
||||
|
||||
<pre><code>$ node-jscoverage lib lib-cov
|
||||
</code></pre>
|
||||
|
||||
<p>Now we can run our tests again, using the <em>lib-cov</em> directory that has been
|
||||
instrumented with coverage statements:</p>
|
||||
|
||||
<pre><code>$ expresso -I lib-cov test/*
|
||||
</code></pre>
|
||||
|
||||
<p>The output will look similar to below, depending on your test coverage of course :)</p>
|
||||
|
||||
<p><img src="http://dl.dropbox.com/u/6396913/cov.png" alt="node coverage" /></p>
|
||||
|
||||
<p>To make this process easier expresso has the <em>-c</em> or <em>--cov</em> which essentially
|
||||
does the same as the two commands above. The following two commands will
|
||||
run the same tests, however one will auto-instrument, and unshift <em>lib-cov</em>,
|
||||
and the other will run tests normally:</p>
|
||||
|
||||
<pre><code>$ expresso -I lib test/*
|
||||
$ expresso -I lib --cov test/*
|
||||
</code></pre>
|
||||
|
||||
<p>Currently coverage is bound to the <em>lib</em> directory, however in the
|
||||
future <code>--cov</code> will most likely accept a path.</p>
|
||||
|
||||
<h2 id="Async-Exports">Async Exports</h2>
|
||||
|
||||
<p>Sometimes it is useful to postpone running of tests until a callback or event has fired, currently the <em>exports.foo = function(){};</em> syntax is supported for this:</p>
|
||||
|
||||
<pre><code>setTimeout(function(){
|
||||
exports['test async exports'] = function(assert){
|
||||
assert.ok('wahoo');
|
||||
};
|
||||
}, 100);
|
||||
</code></pre>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
292
node_modules/ejs/support/expresso/docs/index.md
generated
vendored
Normal file
292
node_modules/ejs/support/expresso/docs/index.md
generated
vendored
Normal file
@ -0,0 +1,292 @@
|
||||
|
||||
[Expresso](http://github.com/visionmedia/expresso) is a JavaScript [TDD](http://en.wikipedia.org/wiki/Test-driven_development) framework written for [nodejs](http://nodejs.org). Expresso is extremely fast, and is packed with features such as additional assertion methods, code coverage reporting, CI support, and more.
|
||||
|
||||
## Features
|
||||
|
||||
- light-weight
|
||||
- intuitive async support
|
||||
- intuitive test runner executable
|
||||
- test coverage support and reporting via [node-jscoverage](http://github.com/visionmedia/node-jscoverage)
|
||||
- uses and extends the core _assert_ module
|
||||
- `assert.eql()` alias of `assert.deepEqual()`
|
||||
- `assert.response()` http response utility
|
||||
- `assert.includes()`
|
||||
- `assert.isNull()`
|
||||
- `assert.isUndefined()`
|
||||
- `assert.isNotNull()`
|
||||
- `assert.isDefined()`
|
||||
- `assert.match()`
|
||||
- `assert.length()`
|
||||
|
||||
## Installation
|
||||
|
||||
To install both expresso _and_ node-jscoverage run
|
||||
the command below, which will first compile node-jscoverage:
|
||||
|
||||
$ make install
|
||||
|
||||
To install expresso alone without coverage reporting run:
|
||||
|
||||
$ make install-expresso
|
||||
|
||||
Install via npm:
|
||||
|
||||
$ npm install expresso
|
||||
|
||||
## Examples
|
||||
|
||||
## Examples
|
||||
|
||||
To define tests we simply export several functions:
|
||||
|
||||
exports['test String#length'] = function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
};
|
||||
|
||||
Alternatively for large numbers of tests you may want to
|
||||
export your own object containing the tests, however this
|
||||
is essentially the as above:
|
||||
|
||||
module.exports = {
|
||||
'test String#length': function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
}
|
||||
};
|
||||
|
||||
If you prefer not to use quoted keys:
|
||||
|
||||
exports.testsStringLength = function(assert){
|
||||
assert.equal(6, 'foobar'.length);
|
||||
};
|
||||
|
||||
The second argument passed to each callback is _beforeExit_,
|
||||
which is typically used to assert that callbacks have been
|
||||
invoked.
|
||||
|
||||
exports.testAsync = function(assert, beforeExit){
|
||||
var n = 0;
|
||||
setTimeout(function(){
|
||||
++n;
|
||||
assert.ok(true);
|
||||
}, 200);
|
||||
setTimeout(function(){
|
||||
++n;
|
||||
assert.ok(true);
|
||||
}, 200);
|
||||
beforeExit(function(){
|
||||
assert.equal(2, n, 'Ensure both timeouts are called');
|
||||
});
|
||||
};
|
||||
|
||||
## Assert Utilities
|
||||
|
||||
### assert.isNull(val[, msg])
|
||||
|
||||
Asserts that the given _val_ is _null_.
|
||||
|
||||
assert.isNull(null);
|
||||
|
||||
### assert.isNotNull(val[, msg])
|
||||
|
||||
Asserts that the given _val_ is not _null_.
|
||||
|
||||
assert.isNotNull(undefined);
|
||||
assert.isNotNull(false);
|
||||
|
||||
### assert.isUndefined(val[, msg])
|
||||
|
||||
Asserts that the given _val_ is _undefined_.
|
||||
|
||||
assert.isUndefined(undefined);
|
||||
|
||||
### assert.isDefined(val[, msg])
|
||||
|
||||
Asserts that the given _val_ is not _undefined_.
|
||||
|
||||
assert.isDefined(null);
|
||||
assert.isDefined(false);
|
||||
|
||||
### assert.match(str, regexp[, msg])
|
||||
|
||||
Asserts that the given _str_ matches _regexp_.
|
||||
|
||||
assert.match('foobar', /^foo(bar)?/);
|
||||
assert.match('foo', /^foo(bar)?/);
|
||||
|
||||
### assert.length(val, n[, msg])
|
||||
|
||||
Assert that the given _val_ has a length of _n_.
|
||||
|
||||
assert.length([1,2,3], 3);
|
||||
assert.length('foo', 3);
|
||||
|
||||
### assert.type(obj, type[, msg])
|
||||
|
||||
Assert that the given _obj_ is typeof _type_.
|
||||
|
||||
assert.type(3, 'number');
|
||||
|
||||
### assert.eql(a, b[, msg])
|
||||
|
||||
Assert that object _b_ is equal to object _a_. This is an
|
||||
alias for the core _assert.deepEqual()_ method which does complex
|
||||
comparisons, opposed to _assert.equal()_ which uses _==_.
|
||||
|
||||
assert.eql('foo', 'foo');
|
||||
assert.eql([1,2], [1,2]);
|
||||
assert.eql({ foo: 'bar' }, { foo: 'bar' });
|
||||
|
||||
### assert.includes(obj, val[, msg])
|
||||
|
||||
Assert that _obj_ is within _val_. This method supports _Array_s
|
||||
and _Strings_s.
|
||||
|
||||
assert.includes([1,2,3], 3);
|
||||
assert.includes('foobar', 'foo');
|
||||
assert.includes('foobar', 'bar');
|
||||
|
||||
### assert.response(server, req, res|fn[, msg|fn])
|
||||
|
||||
Performs assertions on the given _server_, which should _not_ call
|
||||
listen(), as this is handled internally by expresso and the server
|
||||
is killed after all responses have completed. This method works with
|
||||
any _http.Server_ instance, so _Connect_ and _Express_ servers will work
|
||||
as well.
|
||||
|
||||
The _req_ object may contain:
|
||||
|
||||
- _url_ request url
|
||||
- _timeout_ timeout in milliseconds
|
||||
- _method_ HTTP method
|
||||
- _data_ request body
|
||||
- _headers_ headers object
|
||||
|
||||
The _res_ object may be a callback function which
|
||||
receives the response for assertions, or an object
|
||||
which is then used to perform several assertions
|
||||
on the response with the following properties:
|
||||
|
||||
- _body_ assert response body
|
||||
- _status_ assert response status code
|
||||
- _header_ assert that all given headers match (unspecified are ignored)
|
||||
|
||||
When providing _res_ you may then also pass a callback function
|
||||
as the fourth argument for additional assertions.
|
||||
|
||||
Below are some examples:
|
||||
|
||||
assert.response(server, {
|
||||
url: '/', timeout: 500
|
||||
}, {
|
||||
body: 'foobar'
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/',
|
||||
method: 'GET'
|
||||
},{
|
||||
body: '{"name":"tj"}',
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf8',
|
||||
'X-Foo': 'bar'
|
||||
}
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo',
|
||||
method: 'POST',
|
||||
data: 'bar baz'
|
||||
},{
|
||||
body: '/foo bar baz',
|
||||
status: 200
|
||||
}, 'Test POST');
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo',
|
||||
method: 'POST',
|
||||
data: 'bar baz'
|
||||
},{
|
||||
body: '/foo bar baz',
|
||||
status: 200
|
||||
}, function(res){
|
||||
// All done, do some more tests if needed
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/'
|
||||
}, function(res){
|
||||
assert.ok(res.body.indexOf('tj') >= 0, 'Test assert.response() callback');
|
||||
});
|
||||
|
||||
|
||||
## expresso(1)
|
||||
|
||||
To run a single test suite (file) run:
|
||||
|
||||
$ expresso test/a.test.js
|
||||
|
||||
To run several suites we may simply append another:
|
||||
|
||||
$ expresso test/a.test.js test/b.test.js
|
||||
|
||||
We can also pass a whitelist of tests to run within all suites:
|
||||
|
||||
$ expresso --only "foo()" --only "bar()"
|
||||
|
||||
Or several with one call:
|
||||
|
||||
$ expresso --only "foo(), bar()"
|
||||
|
||||
Globbing is of course possible as well:
|
||||
|
||||
$ expresso test/*
|
||||
|
||||
When expresso is called without any files, _test/*_ is the default,
|
||||
so the following is equivalent to the command above:
|
||||
|
||||
$ expresso
|
||||
|
||||
If you wish to unshift a path to `require.paths` before
|
||||
running tests, you may use the `-I` or `--include` flag.
|
||||
|
||||
$ expresso --include lib test/*
|
||||
|
||||
The previous example is typically what I would recommend, since expresso
|
||||
supports test coverage via [node-jscoverage](http://github.com/visionmedia/node-jscoverage) (bundled with expresso),
|
||||
so you will need to expose an instrumented version of you library.
|
||||
|
||||
To instrument your library, simply run [node-jscoverage](http://github.com/visionmedia/node-jscoverage),
|
||||
passing the _src_ and _dest_ directories:
|
||||
|
||||
$ node-jscoverage lib lib-cov
|
||||
|
||||
Now we can run our tests again, using the _lib-cov_ directory that has been
|
||||
instrumented with coverage statements:
|
||||
|
||||
$ expresso -I lib-cov test/*
|
||||
|
||||
The output will look similar to below, depending on your test coverage of course :)
|
||||
|
||||

|
||||
|
||||
To make this process easier expresso has the _-c_ or _--cov_ which essentially
|
||||
does the same as the two commands above. The following two commands will
|
||||
run the same tests, however one will auto-instrument, and unshift _lib-cov_,
|
||||
and the other will run tests normally:
|
||||
|
||||
$ expresso -I lib test/*
|
||||
$ expresso -I lib --cov test/*
|
||||
|
||||
Currently coverage is bound to the _lib_ directory, however in the
|
||||
future `--cov` will most likely accept a path.
|
||||
|
||||
## Async Exports
|
||||
|
||||
Sometimes it is useful to postpone running of tests until a callback or event has fired, currently the _exports.foo = function(){};_ syntax is supported for this:
|
||||
|
||||
setTimeout(function(){
|
||||
exports['test async exports'] = function(assert){
|
||||
assert.ok('wahoo');
|
||||
};
|
||||
}, 100);
|
||||
3
node_modules/ejs/support/expresso/docs/layout/foot.html
generated
vendored
Normal file
3
node_modules/ejs/support/expresso/docs/layout/foot.html
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
47
node_modules/ejs/support/expresso/docs/layout/head.html
generated
vendored
Normal file
47
node_modules/ejs/support/expresso/docs/layout/head.html
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Expresso - TDD Framework For Node</title>
|
||||
<style>
|
||||
body {
|
||||
font: 13px/1.4 "Helvetica", "Lucida Grande", Arial, sans-serif;
|
||||
}
|
||||
#header {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 0;
|
||||
padding: 14px 0 12px 0;
|
||||
text-indent: 40px;
|
||||
font-family: "Helvetica";
|
||||
width: 100%;
|
||||
border-top: 1px solid rgba(0,0,0,0.2);
|
||||
border-bottom: 1px solid rgba(0,0,0,0.2);
|
||||
background: rgba(255,255,255,0.6) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
|
||||
text-align: left;
|
||||
color: #888;
|
||||
}
|
||||
#ribbon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
#wrapper {
|
||||
padding: 80px;
|
||||
}
|
||||
h1, h2, h3 {
|
||||
margin: 25px 0 15px 0;
|
||||
}
|
||||
pre {
|
||||
margin: 0 5px;
|
||||
padding: 10px;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="http://github.com/visionmedia/expresso">
|
||||
<img alt="Fork me on GitHub" id="ribbon" src="http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" />
|
||||
</a>
|
||||
<div id="header"><strong>Sencha</strong> labs</div>
|
||||
<div id="wrapper">
|
||||
<h1>Expresso</h1>
|
||||
4
node_modules/ejs/support/expresso/lib/bar.js
generated
vendored
Normal file
4
node_modules/ejs/support/expresso/lib/bar.js
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
exports.bar = function(msg){
|
||||
return msg || 'bar';
|
||||
};
|
||||
16
node_modules/ejs/support/expresso/lib/foo.js
generated
vendored
Normal file
16
node_modules/ejs/support/expresso/lib/foo.js
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
exports.foo = function(msg){
|
||||
if (msg) {
|
||||
return msg;
|
||||
} else {
|
||||
return generateFoo();
|
||||
}
|
||||
};
|
||||
|
||||
function generateFoo() {
|
||||
return 'foo';
|
||||
}
|
||||
|
||||
function Foo(msg){
|
||||
this.msg = msg || 'foo';
|
||||
}
|
||||
9
node_modules/ejs/support/expresso/package.json
generated
vendored
Normal file
9
node_modules/ejs/support/expresso/package.json
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{ "name": "expresso",
|
||||
"version": "0.6.1",
|
||||
"description": "TDD framework, light-weight, fast, CI-friendly",
|
||||
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
||||
"bin": { "expresso": "./bin/expresso" },
|
||||
"scripts": {
|
||||
"install": "make install-jscov"
|
||||
}
|
||||
}
|
||||
84
node_modules/ejs/support/expresso/test/assert.test.js
generated
vendored
Normal file
84
node_modules/ejs/support/expresso/test/assert.test.js
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
module.exports = {
|
||||
'assert.eql()': function(assert){
|
||||
assert.equal(assert.deepEqual, assert.eql);
|
||||
},
|
||||
|
||||
'assert.type()': function(assert){
|
||||
assert.type('foobar', 'string');
|
||||
assert.type(2, 'number');
|
||||
assert.throws(function(){
|
||||
assert.type([1,2,3], 'string');
|
||||
});
|
||||
},
|
||||
|
||||
'assert.includes()': function(assert){
|
||||
assert.includes('some random string', 'dom');
|
||||
assert.throws(function(){
|
||||
assert.include('some random string', 'foobar');
|
||||
});
|
||||
|
||||
assert.includes(['foo', 'bar'], 'bar');
|
||||
assert.includes(['foo', 'bar'], 'foo');
|
||||
assert.includes([1,2,3], 3);
|
||||
assert.includes([1,2,3], 2);
|
||||
assert.includes([1,2,3], 1);
|
||||
assert.throws(function(){
|
||||
assert.includes(['foo', 'bar'], 'baz');
|
||||
});
|
||||
|
||||
assert.throws(function(){
|
||||
assert.includes({ wrong: 'type' }, 'foo');
|
||||
});
|
||||
},
|
||||
|
||||
'assert.isNull()': function(assert){
|
||||
assert.isNull(null);
|
||||
assert.throws(function(){
|
||||
assert.isNull(undefined);
|
||||
});
|
||||
assert.throws(function(){
|
||||
assert.isNull(false);
|
||||
});
|
||||
},
|
||||
|
||||
'assert.isUndefined()': function(assert){
|
||||
assert.isUndefined(undefined);
|
||||
assert.throws(function(){
|
||||
assert.isUndefined(null);
|
||||
});
|
||||
assert.throws(function(){
|
||||
assert.isUndefined(false);
|
||||
});
|
||||
},
|
||||
|
||||
'assert.isNotNull()': function(assert){
|
||||
assert.isNotNull(false);
|
||||
assert.isNotNull(undefined);
|
||||
assert.throws(function(){
|
||||
assert.isNotNull(null);
|
||||
});
|
||||
},
|
||||
|
||||
'assert.isDefined()': function(assert){
|
||||
assert.isDefined(false);
|
||||
assert.isDefined(null);
|
||||
assert.throws(function(){
|
||||
assert.isDefined(undefined);
|
||||
});
|
||||
},
|
||||
|
||||
'assert.match()': function(assert){
|
||||
assert.match('foobar', /foo(bar)?/);
|
||||
assert.throws(function(){
|
||||
assert.match('something', /rawr/);
|
||||
});
|
||||
},
|
||||
|
||||
'assert.length()': function(assert){
|
||||
assert.length('test', 4);
|
||||
assert.length([1,2,3,4], 4);
|
||||
assert.throws(function(){
|
||||
assert.length([1,2,3], 4);
|
||||
});
|
||||
}
|
||||
};
|
||||
6
node_modules/ejs/support/expresso/test/async.test.js
generated
vendored
Normal file
6
node_modules/ejs/support/expresso/test/async.test.js
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
setTimeout(function(){
|
||||
exports['test async exports'] = function(assert){
|
||||
assert.ok('wahoo');
|
||||
};
|
||||
}, 100);
|
||||
12
node_modules/ejs/support/expresso/test/bar.test.js
generated
vendored
Normal file
12
node_modules/ejs/support/expresso/test/bar.test.js
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var bar = require('bar');
|
||||
|
||||
module.exports = {
|
||||
'bar()': function(assert){
|
||||
assert.equal('bar', bar.bar());
|
||||
}
|
||||
};
|
||||
13
node_modules/ejs/support/expresso/test/foo.test.js
generated
vendored
Normal file
13
node_modules/ejs/support/expresso/test/foo.test.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var foo = require('foo');
|
||||
|
||||
module.exports = {
|
||||
'foo()': function(assert){
|
||||
assert.equal('foo', foo.foo());
|
||||
assert.equal('foo', foo.foo());
|
||||
}
|
||||
};
|
||||
76
node_modules/ejs/support/expresso/test/http.test.js
generated
vendored
Normal file
76
node_modules/ejs/support/expresso/test/http.test.js
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var http = require('http');
|
||||
|
||||
var server = http.createServer(function(req, res){
|
||||
if (req.method === 'GET') {
|
||||
if (req.url === '/delay') {
|
||||
setTimeout(function(){
|
||||
res.writeHead(200, {});
|
||||
res.end('delayed');
|
||||
}, 200);
|
||||
} else {
|
||||
var body = JSON.stringify({ name: 'tj' });
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'application/json; charset=utf8',
|
||||
'Content-Length': body.length
|
||||
});
|
||||
res.end(body);
|
||||
}
|
||||
} else {
|
||||
var body = '';
|
||||
req.setEncoding('utf8');
|
||||
req.addListener('data', function(chunk){ body += chunk });
|
||||
req.addListener('end', function(){
|
||||
res.writeHead(200, {});
|
||||
res.end(req.url + ' ' + body);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
'test assert.response()': function(assert, beforeExit){
|
||||
var called = 0;
|
||||
|
||||
assert.response(server, {
|
||||
url: '/',
|
||||
method: 'GET'
|
||||
},{
|
||||
body: '{"name":"tj"}',
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf8'
|
||||
}
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo',
|
||||
method: 'POST',
|
||||
data: 'bar baz'
|
||||
},{
|
||||
body: '/foo bar baz',
|
||||
status: 200
|
||||
}, function(res){
|
||||
++called;
|
||||
assert.ok(res);
|
||||
});
|
||||
|
||||
assert.response(server, {
|
||||
url: '/foo'
|
||||
}, function(res){
|
||||
++called;
|
||||
assert.ok(res.body.indexOf('tj') >= 0, 'Test assert.response() callback');
|
||||
});
|
||||
|
||||
assert.response(server,
|
||||
{ url: '/delay', timeout: 300 },
|
||||
{ body: 'delayed' });
|
||||
|
||||
beforeExit(function(){
|
||||
assert.equal(2, called);
|
||||
});
|
||||
}
|
||||
};
|
||||
245
node_modules/ejs/test/ejs.test.js
generated
vendored
Normal file
245
node_modules/ejs/test/ejs.test.js
generated
vendored
Normal file
@ -0,0 +1,245 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var ejs = require('ejs');
|
||||
|
||||
module.exports = {
|
||||
'test .version': function(assert){
|
||||
assert.ok(/^\d+\.\d+\.\d+$/.test(ejs.version), 'Test .version format');
|
||||
},
|
||||
|
||||
'test html': function(assert){
|
||||
assert.equal('<p>yay</p>', ejs.render('<p>yay</p>'));
|
||||
},
|
||||
|
||||
'test buffered code': function(assert){
|
||||
var html = '<p>tj</p>',
|
||||
str = '<p><%= name %></p>',
|
||||
locals = { name: 'tj' };
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test unbuffered code': function(assert){
|
||||
var html = '<p>tj</p>',
|
||||
str = '<% if (name) { %><p><%= name %></p><% } %>',
|
||||
locals = { name: 'tj' };
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test `scope` option': function(assert){
|
||||
var html = '<p>tj</p>',
|
||||
str = '<p><%= this %></p>';
|
||||
assert.equal(html, ejs.render(str, { scope: 'tj' }));
|
||||
},
|
||||
|
||||
'test escaping': function(assert){
|
||||
assert.equal('<script>', ejs.render('<%= "<script>" %>'));
|
||||
assert.equal('<script>', ejs.render('<%- "<script>" %>'));
|
||||
},
|
||||
|
||||
'test newlines': function(assert){
|
||||
var html = '\n<p>tj</p>\n<p>tj@sencha.com</p>',
|
||||
str = '<% if (name) { %>\n<p><%= name %></p>\n<p><%= email %></p><% } %>',
|
||||
locals = { name: 'tj', email: 'tj@sencha.com' };
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test single quotes': function(assert){
|
||||
var html = '<p>WAHOO</p>',
|
||||
str = "<p><%= up('wahoo') %></p>",
|
||||
locals = { up: function(str){ return str.toUpperCase(); }};
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test single quotes in the html': function(assert){
|
||||
var html = '<p>WAHOO that\'s cool</p>',
|
||||
str = '<p><%= up(\'wahoo\') %> that\'s cool</p>',
|
||||
locals = { up: function(str){ return str.toUpperCase(); }};
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test multiple single quotes': function(assert) {
|
||||
var html = "<p>couldn't shouldn't can't</p>",
|
||||
str = "<p>couldn't shouldn't can't</p>";
|
||||
assert.equal(html, ejs.render(str));
|
||||
},
|
||||
|
||||
'test single quotes inside tags': function(assert) {
|
||||
var html = '<p>string</p>',
|
||||
str = "<p><%= 'string' %></p>";
|
||||
assert.equal(html, ejs.render(str));
|
||||
},
|
||||
|
||||
'test back-slashes in the document': function(assert) {
|
||||
var html = "<p>backslash: '\\'</p>",
|
||||
str = "<p>backslash: '\\'</p>";
|
||||
assert.equal(html, ejs.render(str));
|
||||
},
|
||||
|
||||
'test double quotes': function(assert){
|
||||
var html = '<p>WAHOO</p>',
|
||||
str = '<p><%= up("wahoo") %></p>',
|
||||
locals = { up: function(str){ return str.toUpperCase(); }};
|
||||
assert.equal(html, ejs.render(str, { locals: locals }));
|
||||
},
|
||||
|
||||
'test multiple double quotes': function(assert) {
|
||||
var html = '<p>just a "test" wahoo</p>',
|
||||
str = '<p>just a "test" wahoo</p>';
|
||||
assert.equal(html, ejs.render(str));
|
||||
},
|
||||
|
||||
'test whitespace': function(assert){
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p><%="foo"%></p>';
|
||||
assert.equal(html, ejs.render(str));
|
||||
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p><%=bar%></p>';
|
||||
assert.equal(html, ejs.render(str, { locals: { bar: 'foo' }}));
|
||||
},
|
||||
|
||||
'test custom tags': function(assert){
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p>{{= "foo" }}</p>';
|
||||
|
||||
assert.equal(html, ejs.render(str, {
|
||||
open: '{{',
|
||||
close: '}}'
|
||||
}));
|
||||
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p><?= "foo" ?></p>';
|
||||
|
||||
assert.equal(html, ejs.render(str, {
|
||||
open: '<?',
|
||||
close: '?>'
|
||||
}));
|
||||
},
|
||||
|
||||
'test custom tags over 2 chars': function(assert){
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p>{{{{= "foo" }>>}</p>';
|
||||
|
||||
assert.equal(html, ejs.render(str, {
|
||||
open: '{{{{',
|
||||
close: '}>>}'
|
||||
}));
|
||||
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p><??= "foo" ??></p>';
|
||||
|
||||
assert.equal(html, ejs.render(str, {
|
||||
open: '<??',
|
||||
close: '??>'
|
||||
}));
|
||||
},
|
||||
|
||||
'test global custom tags': function(assert){
|
||||
var html = '<p>foo</p>',
|
||||
str = '<p>{{= "foo" }}</p>';
|
||||
ejs.open = '{{';
|
||||
ejs.close = '}}';
|
||||
assert.equal(html, ejs.render(str));
|
||||
delete ejs.open;
|
||||
delete ejs.close;
|
||||
},
|
||||
|
||||
'test iteration': function(assert){
|
||||
var html = '<p>foo</p>',
|
||||
str = '<% for (var key in items) { %>'
|
||||
+ '<p><%= items[key] %></p>'
|
||||
+ '<% } %>';
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
items: ['foo']
|
||||
}
|
||||
}));
|
||||
|
||||
var html = '<p>foo</p>',
|
||||
str = '<% items.forEach(function(item){ %>'
|
||||
+ '<p><%= item %></p>'
|
||||
+ '<% }) %>';
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
items: ['foo']
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
'test filter support': function(assert){
|
||||
var html = 'Zab',
|
||||
str = '<%=: items | reverse | first | reverse | capitalize %>';
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
items: ['foo', 'bar', 'baz']
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
'test filter argument support': function(assert){
|
||||
var html = 'tj, guillermo',
|
||||
str = '<%=: users | map:"name" | join:", " %>';
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
users: [
|
||||
{ name: 'tj' },
|
||||
{ name: 'guillermo' }
|
||||
]
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
'test sort_by filter': function(assert){
|
||||
var html = 'tj',
|
||||
str = '<%=: users | sort_by:"name" | last | get:"name" %>';
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
users: [
|
||||
{ name: 'guillermo' },
|
||||
{ name: 'tj' },
|
||||
{ name: 'mape' }
|
||||
]
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
'test custom filters': function(assert){
|
||||
var html = 'Welcome Tj Holowaychuk',
|
||||
str = '<%=: users | first | greeting %>';
|
||||
|
||||
ejs.filters.greeting = function(user){
|
||||
return 'Welcome ' + user.first + ' ' + user.last + '';
|
||||
};
|
||||
|
||||
assert.equal(html, ejs.render(str, {
|
||||
locals: {
|
||||
users: [
|
||||
{ first: 'Tj', last: 'Holowaychuk' }
|
||||
]
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
'test useful stack traces': function(assert){
|
||||
var str = [
|
||||
"A little somethin'",
|
||||
"somethin'",
|
||||
"<% if (name) { %>", // Failing line
|
||||
" <p><%= name %></p>",
|
||||
" <p><%= email %></p>",
|
||||
"<% } %>"
|
||||
].join("\n");
|
||||
|
||||
try {
|
||||
ejs.render(str)
|
||||
} catch( err ){
|
||||
assert.includes(err.message,"name is not defined");
|
||||
assert.eql(err.name,"ReferenceError");
|
||||
var lineno = parseInt(err.toString().match(/ejs:(\d+)\n/)[1]);
|
||||
assert.eql(lineno,3,"Error should been thrown on line 3, was thrown on line "+lineno);
|
||||
}
|
||||
}
|
||||
};
|
||||
18
templates/default/index.js
Normal file
18
templates/default/index.js
Normal file
@ -0,0 +1,18 @@
|
||||
exports.publish = function(docDb) {
|
||||
var ejs = require('ejs');
|
||||
|
||||
function find(spec) {
|
||||
return docDb.get( docDb.find(spec) );
|
||||
}
|
||||
|
||||
var functions = find({'kind': 'function'});
|
||||
//console.log(functions);
|
||||
|
||||
var data = {title: 'All Functions', functions: functions};
|
||||
|
||||
var template = '<h1><%= title %></h1>\n<ul>\n<%for (var f in functions){%><li><%=functions[f].longname%></li>\n<%}%></ul>';
|
||||
|
||||
var output = ejs.render(template, {locals: data});
|
||||
|
||||
return 'Hello: '+output;
|
||||
}
|
||||
1427
templates/lib/taffy.js
Normal file
1427
templates/lib/taffy.js
Normal file
File diff suppressed because it is too large
Load Diff
15
test-rhino.js
Executable file
15
test-rhino.js
Executable file
@ -0,0 +1,15 @@
|
||||
load('lib/rhino-shim.js');
|
||||
load('lib/nodeunit.js');
|
||||
|
||||
var fs = require('fs'),
|
||||
testFiles = fs.ls('./test/'),
|
||||
testFile;
|
||||
|
||||
while ( testFile = testFiles.shift() ) {
|
||||
var testName = testFile.replace(/\.js$/, '');
|
||||
var test = {};
|
||||
|
||||
test[testName] = require(testName);
|
||||
|
||||
nodeunit.run(test);
|
||||
}
|
||||
8
test.js
Normal file
8
test.js
Normal file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
if (typeof load !== 'undefined') {
|
||||
load('lib/rhino-shim.js');
|
||||
}
|
||||
|
||||
var reporter = require('nodeunit').reporters['default'];
|
||||
reporter.run(['./test']);
|
||||
2
test/examples/only_comments.js
Normal file
2
test/examples/only_comments.js
Normal file
@ -0,0 +1,2 @@
|
||||
/**@overview nothing but comments 1*/
|
||||
/**@overview nothing but comments 2*/
|
||||
13
test/jsdoc_parser.js
Normal file
13
test/jsdoc_parser.js
Normal file
@ -0,0 +1,13 @@
|
||||
var parser = require('jsdoc/parser');
|
||||
|
||||
exports['The jsdoc parser should exist.'] = function(t) {
|
||||
t.expect(1);
|
||||
t.equal( typeof parser, 'object' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['The parser should have a parse function.'] = function(t) {
|
||||
t.expect(1);
|
||||
t.equal( typeof parser.parse, 'function' );
|
||||
t.done();
|
||||
};
|
||||
38
test/jsdoc_parser_comments.js
Normal file
38
test/jsdoc_parser_comments.js
Normal file
@ -0,0 +1,38 @@
|
||||
var parser = require('jsdoc/parser');
|
||||
var dumper = require('jsdoc/util/dumper');
|
||||
|
||||
exports['Parse a source containing only a jsdoc comment.'] = function(t) {
|
||||
t.expect(1);
|
||||
var docs = parser.parse('/**@doc*/');
|
||||
t.equal( docs.length, 1, 'should result in docs that contain the comment' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Parse a source ending with a jsdoc comment.'] = function(t) {
|
||||
t.expect(1);
|
||||
var docs = parser.parse(';/**@doc*/');
|
||||
t.equal( docs.length, 1, 'should result in docs that contain the comment' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Parse a source with a jsdoc comment preceding a jsdoc comment.'] = function(t) {
|
||||
t.expect(1);
|
||||
var docs = parser.parse('/**@doc1*/ /**@doc2*/ var x;');
|
||||
t.equal( docs.length, 2, 'should result in docs containing both the comments' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Parse a source with only single line comments.'] = function(t) {
|
||||
t.expect(1);
|
||||
var docs = parser.parse('// foo');
|
||||
t.equal( docs.length, 0, 'should result in docs that are empty' );
|
||||
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Parse a source with only single non-jsdoc multi-line comments.'] = function(t) {
|
||||
t.expect(1);
|
||||
var docs = parser.parse('/*foo*/');
|
||||
t.equal( docs.length, 0, 'should result in docs that are empty' );
|
||||
t.done();
|
||||
};
|
||||
29
test/jsdoc_parser_function.js
Normal file
29
test/jsdoc_parser_function.js
Normal file
@ -0,0 +1,29 @@
|
||||
var parser = require('jsdoc/parser');
|
||||
|
||||
exports['An undocumented named function.'] = function(t) {
|
||||
t.expect(3);
|
||||
var docs = parser.parse('function foo() {}');
|
||||
t.equal( docs.length, 1, 'should result in 1 doc' );
|
||||
t.equal( typeof docs[0].longname, 'string', 'should have a longname set' );
|
||||
t.equal( docs[0].longname, 'foo', 'should have a longname equal to the function name' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['A documented named function.'] = function(t) {
|
||||
t.expect(4);
|
||||
var docs = parser.parse('/**@desc a function*/ function foo() {}');
|
||||
t.equal( docs.length, 1, 'should result in 1 doc' );
|
||||
t.equal( docs[0].longname, 'foo', 'should have a longname equal to the function name' );
|
||||
t.equal( typeof docs[0].jsdoc, 'object', 'should have a jsdoc set' );
|
||||
t.equal( docs[0].jsdoc.src, '@desc a function', 'should have a jsdoc equal to the preceding doc comment' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['A nested documented named function.'] = function(t) {
|
||||
t.expect(2);
|
||||
var docs = parser.parse('function foo() { /**@desc a function*/ function bar() {} }');
|
||||
t.equal( docs.length, 2, 'should result in 2 docs' );
|
||||
t.equal( docs[1].longname, 'foo~bar', 'the inner function should have a longname equal to <the outer function name>~<the inner function name>' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
24
test/narcissus.js
Normal file
24
test/narcissus.js
Normal file
@ -0,0 +1,24 @@
|
||||
var narcissus = require('narcissus');
|
||||
|
||||
exports['Narcissus should exist.'] = function(t) {
|
||||
t.expect(2);
|
||||
t.equal( typeof narcissus, 'object' );
|
||||
t.equal( typeof narcissus.Narcissus, 'object' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Narcissus parse should be a function.'] = function(t) {
|
||||
t.expect(2);
|
||||
t.equal( typeof narcissus.Narcissus.parser, 'object' );
|
||||
t.equal( typeof narcissus.Narcissus.parser.parse, 'function' );
|
||||
t.done();
|
||||
};
|
||||
|
||||
exports['Narcissus parse should generate an AST from source.'] = function(t) {
|
||||
t.expect(1);
|
||||
var src = 'var foo = 1;',
|
||||
ast = narcissus.Narcissus.parser.parse(src, 'filename', 1);
|
||||
|
||||
t.equal( typeof ast, 'object' );
|
||||
t.done();
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user