2011-08-22 22:34:20 -05:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
var fs = require('fs')
|
|
|
|
, path = require('path')
|
2011-08-22 23:40:55 -05:00
|
|
|
, marked = require('marked')
|
2013-01-06 21:43:11 -06:00
|
|
|
, dir = __dirname + '/tests'
|
|
|
|
, files;
|
2013-01-03 08:29:40 -06:00
|
|
|
|
|
|
|
function load() {
|
2011-08-22 23:16:25 -05:00
|
|
|
files = {};
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2011-08-22 23:16:25 -05:00
|
|
|
var list = fs
|
|
|
|
.readdirSync(dir)
|
|
|
|
.filter(function(file) {
|
|
|
|
return path.extname(file) !== '.html';
|
|
|
|
})
|
|
|
|
.sort(function(a, b) {
|
|
|
|
a = path.basename(a).toLowerCase().charCodeAt(0);
|
|
|
|
b = path.basename(b).toLowerCase().charCodeAt(0);
|
|
|
|
return a > b ? 1 : (a < b ? -1 : 0);
|
|
|
|
});
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2011-08-22 23:16:25 -05:00
|
|
|
var i = 0
|
|
|
|
, l = list.length
|
|
|
|
, file;
|
|
|
|
|
|
|
|
for (; i < l; i++) {
|
|
|
|
file = path.join(dir, list[i]);
|
|
|
|
files[path.basename(file)] = {
|
|
|
|
text: fs.readFileSync(file, 'utf8'),
|
|
|
|
html: fs.readFileSync(file.replace(/[^.]+$/, 'html'), 'utf8')
|
|
|
|
};
|
|
|
|
}
|
2012-03-10 17:27:44 -06:00
|
|
|
|
|
|
|
return files;
|
2013-01-03 08:29:40 -06:00
|
|
|
}
|
2011-08-22 23:16:25 -05:00
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
function runTests(options) {
|
2011-08-22 23:16:25 -05:00
|
|
|
if (!files) load();
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
var options = options || {}
|
|
|
|
, complete = 0
|
2011-08-22 23:16:25 -05:00
|
|
|
, keys = Object.keys(files)
|
2013-01-06 21:43:11 -06:00
|
|
|
, i = 0
|
|
|
|
, len = keys.length
|
2011-08-22 23:16:25 -05:00
|
|
|
, filename
|
|
|
|
, file
|
|
|
|
, text
|
2013-01-06 21:43:11 -06:00
|
|
|
, html
|
|
|
|
, j
|
|
|
|
, l;
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2011-10-22 08:36:34 -05:00
|
|
|
main:
|
2013-01-06 21:43:11 -06:00
|
|
|
for (; i < len; i++) {
|
|
|
|
filename = keys[i];
|
2011-08-22 23:16:25 -05:00
|
|
|
file = files[filename];
|
|
|
|
|
2011-10-22 08:36:34 -05:00
|
|
|
try {
|
2011-08-22 23:40:55 -05:00
|
|
|
text = marked(file.text).replace(/\s/g, '');
|
2011-08-22 23:16:25 -05:00
|
|
|
html = file.html.replace(/\s/g, '');
|
2011-10-22 08:36:34 -05:00
|
|
|
} catch(e) {
|
|
|
|
console.log('%s failed.', filename);
|
|
|
|
throw e;
|
2011-08-22 22:34:20 -05:00
|
|
|
}
|
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
j = 0;
|
|
|
|
l = html.length;
|
2011-08-22 23:16:25 -05:00
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
for (; j < l; j++) {
|
|
|
|
if (text[j] !== html[j]) {
|
2011-08-22 22:34:20 -05:00
|
|
|
text = text.substring(
|
2013-01-06 21:43:11 -06:00
|
|
|
Math.max(j - 30, 0),
|
|
|
|
Math.min(j + 30, text.length));
|
2012-03-11 00:45:28 -06:00
|
|
|
|
2011-08-22 22:34:20 -05:00
|
|
|
html = html.substring(
|
2013-01-06 21:43:11 -06:00
|
|
|
Math.max(j - 30, 0),
|
|
|
|
Math.min(j + 30, html.length));
|
2012-03-11 00:45:28 -06:00
|
|
|
|
2011-08-22 22:34:20 -05:00
|
|
|
console.log(
|
2011-10-22 08:36:34 -05:00
|
|
|
'\n#%d. %s failed at offset %d. Near: "%s".\n',
|
2013-01-06 21:43:11 -06:00
|
|
|
i + 1, filename, j, text);
|
2012-03-11 00:45:28 -06:00
|
|
|
|
|
|
|
console.log('\nGot:\n%s\n', text.trim() || text);
|
|
|
|
console.log('\nExpected:\n%s\n', html.trim() || html);
|
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
if (options.stop) {
|
2011-08-22 22:34:20 -05:00
|
|
|
break main;
|
|
|
|
}
|
2013-01-06 21:43:11 -06:00
|
|
|
|
|
|
|
continue main;
|
2011-08-22 22:34:20 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
complete++;
|
|
|
|
console.log('#%d. %s completed.', i + 1, filename);
|
2011-08-22 22:34:20 -05:00
|
|
|
}
|
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
console.log('%d/%d tests completed successfully.', complete, len);
|
2013-01-03 08:29:40 -06:00
|
|
|
}
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2013-01-03 08:29:40 -06:00
|
|
|
function bench(name, func) {
|
2012-01-02 23:59:13 -06:00
|
|
|
if (!files) {
|
|
|
|
load();
|
2013-01-06 21:43:11 -06:00
|
|
|
// Change certain tests to allow
|
2012-01-06 01:07:45 -06:00
|
|
|
// comparison to older benchmark times.
|
2012-01-09 08:18:24 -06:00
|
|
|
fs.readdirSync(__dirname + '/new').forEach(function(name) {
|
|
|
|
if (name.split('.').pop() === 'html') return;
|
|
|
|
if (name === 'main.text') return;
|
|
|
|
delete files[name];
|
2012-01-02 23:59:13 -06:00
|
|
|
});
|
2012-01-14 04:45:06 -06:00
|
|
|
files['backslash_escapes.text'] = {
|
|
|
|
text: 'hello world \\[how](are you) today'
|
|
|
|
};
|
2012-01-28 16:53:34 -06:00
|
|
|
files['main.text'].text = files['main.text'].text.replace('* * *\n\n', '');
|
2012-01-02 23:59:13 -06:00
|
|
|
}
|
2011-08-22 23:16:25 -05:00
|
|
|
|
|
|
|
var start = Date.now()
|
|
|
|
, times = 1000
|
|
|
|
, keys = Object.keys(files)
|
2013-01-06 21:43:11 -06:00
|
|
|
, i
|
2011-08-22 23:16:25 -05:00
|
|
|
, l = keys.length
|
|
|
|
, filename
|
|
|
|
, file;
|
|
|
|
|
|
|
|
while (times--) {
|
|
|
|
for (i = 0; i < l; i++) {
|
|
|
|
filename = keys[i];
|
|
|
|
file = files[filename];
|
|
|
|
func(file.text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('%s completed in %dms.', name, Date.now() - start);
|
2013-01-03 08:29:40 -06:00
|
|
|
}
|
2011-08-22 23:16:25 -05:00
|
|
|
|
2013-01-03 08:29:40 -06:00
|
|
|
function runBench() {
|
2012-02-20 07:54:26 -06:00
|
|
|
marked.setOptions({ gfm: false });
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('marked', marked);
|
2011-08-22 23:16:25 -05:00
|
|
|
|
2012-02-20 07:54:26 -06:00
|
|
|
marked.setOptions({ gfm: true });
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('marked (gfm)', marked);
|
2012-02-19 21:51:52 -06:00
|
|
|
|
2012-02-20 07:54:26 -06:00
|
|
|
marked.setOptions({ pedantic: true });
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('marked (pedantic)', marked);
|
2012-02-19 20:29:35 -06:00
|
|
|
|
2012-01-03 02:25:47 -06:00
|
|
|
var discount = require('discount').parse;
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('discount', discount);
|
2012-01-03 02:25:47 -06:00
|
|
|
|
2011-08-22 23:16:25 -05:00
|
|
|
var showdown = (function() {
|
|
|
|
var Showdown = require('showdown').Showdown;
|
|
|
|
var convert = new Showdown.converter();
|
|
|
|
return function(text) {
|
|
|
|
return convert.makeHtml(text);
|
|
|
|
};
|
|
|
|
})();
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('showdown (reuse converter)', showdown);
|
2011-10-22 08:36:34 -05:00
|
|
|
|
|
|
|
var showdown_slow = (function() {
|
|
|
|
var Showdown = require('showdown').Showdown;
|
|
|
|
return function(text) {
|
|
|
|
var convert = new Showdown.converter();
|
|
|
|
return convert.makeHtml(text);
|
|
|
|
};
|
|
|
|
})();
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('showdown (new converter)', showdown_slow);
|
2011-08-22 23:16:25 -05:00
|
|
|
|
2011-12-10 15:21:01 -06:00
|
|
|
var markdownjs = require('markdown');
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('markdown-js', function(text) {
|
2011-12-10 15:21:01 -06:00
|
|
|
markdownjs.parse(text);
|
2011-08-22 23:16:25 -05:00
|
|
|
});
|
2013-01-03 08:29:40 -06:00
|
|
|
}
|
2011-08-22 22:34:20 -05:00
|
|
|
|
2013-01-03 08:29:40 -06:00
|
|
|
function time() {
|
2011-10-22 08:36:34 -05:00
|
|
|
var marked = require('../');
|
2013-01-03 08:29:40 -06:00
|
|
|
bench('marked', marked);
|
|
|
|
}
|
2011-10-22 08:36:34 -05:00
|
|
|
|
2013-01-03 08:29:40 -06:00
|
|
|
function main(argv) {
|
|
|
|
if (~argv.indexOf('--bench')) {
|
|
|
|
return runBench();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (~argv.indexOf('--time')) {
|
|
|
|
return time();
|
2011-08-22 23:16:25 -05:00
|
|
|
}
|
2013-01-03 08:29:40 -06:00
|
|
|
|
2013-01-06 21:43:11 -06:00
|
|
|
return runTests({
|
|
|
|
stop: !!~argv.indexOf('--stop')
|
|
|
|
});
|
2013-01-03 08:29:40 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!module.parent) {
|
|
|
|
main(process.argv.slice());
|
2011-08-22 23:16:25 -05:00
|
|
|
} else {
|
2013-01-03 08:29:40 -06:00
|
|
|
main = runTests;
|
2012-03-11 00:45:28 -06:00
|
|
|
main.main = main;
|
2012-03-10 17:27:44 -06:00
|
|
|
main.load = load;
|
2013-01-03 08:29:40 -06:00
|
|
|
main.bench = bench;
|
2011-08-22 23:16:25 -05:00
|
|
|
module.exports = main;
|
|
|
|
}
|