diff --git a/index.js b/index.js index 037aceb..1fda8f9 100644 --- a/index.js +++ b/index.js @@ -11,10 +11,10 @@ var runners = require("./lib/runners"); * @param {Object} opts run options * @property {Boolean} opts.bash whether to include bash parsing * @param {Function} done callback when test is complete. Node callback signature - * @return {Void} no return value + * @return {Promise} */ module.exports = function(filepath, opts, done) { - if(done === undefined) { + if(done === undefined && typeof(opts) === "function") { done = opts; } opts = opts || {}; @@ -27,44 +27,58 @@ module.exports = function(filepath, opts, done) { var dirname = path.dirname(filepath); - var md = fs.readFile(filepath, function(err, raw) { - if(err) return done(err); + return new Promise(function(resolve, reject) { + var _done = function(err) { + if(err) { + reject(err); + } + else { + resolve() + } + if(done) { + done(err); + } + } - var md = raw.toString(); - var tokens = marked.lexer(md, {gfm: true}); + fs.readFile(filepath, function(err, raw) { + if(err) return _done(err); - tokens - .forEach(function(token) { - var lang = token.lang; - if(lang && availLangs.indexOf(lang) > -1 && token.type === "code") { - code[lang] = code[lang] || ""; - code[lang] = code[lang] + token.text + "\n"; - return ""; - } - }); + var md = raw.toString(); + var tokens = marked.lexer(md, {gfm: true}); + + tokens + .forEach(function(token) { + var lang = token.lang; + if(lang && availLangs.indexOf(lang) > -1 && token.type === "code") { + code[lang] = code[lang] || ""; + code[lang] = code[lang] + token.text + "\n"; + return ""; + } + }); + + var toRun = []; + var toRun = Object.keys(code) + .map(function(lang) { + var runner = runners[lang]; + if(!runner) { + debug("no runner for lang: %s", lang); + } + return function(done) { + runner(dirname, code[lang], done); + }; + }); - var toRun = []; - var toRun = Object.keys(code) - .map(function(lang) { - var runner = runners[lang]; - if(!runner) { - debug("no runner for lang: %s", lang); + toRun.shift()(function fn(err) { + if(err) { + _done(err); + } + else if(toRun.length > 0) { + toRun.shift()(fn) + } + else { + _done(); } - return function(done) { - runner(dirname, code[lang], done); - }; }); - - toRun.shift()(function fn(err) { - if(err) { - done(err); - } - else if(toRun.length > 0) { - toRun.shift()(fn) - } - else { - done(); - } - }); - }) + }) + }); } diff --git a/test/index.js b/test/index.js index fdf4e94..d36a919 100644 --- a/test/index.js +++ b/test/index.js @@ -1,53 +1,86 @@ var assert = require("assert"); var readtest = require("../"); -describe("readtest", function() { - it("success", function(done) { - readtest(__dirname+"/examples/success/README.md", function(err) { - assert.ifError(err); - done(); - }); - }); - - it("success_inner", function(done) { - readtest(__dirname+"/examples/success_inner/README.md", function(err) { - assert.ifError(err); - done(); - }); - }); - - it("success-multiple", function(done) { - readtest(__dirname+"/examples/success-multiple/README.md", function(err) { - assert.ifError(err); - done(); - }); - }); +describe("readme-tester", function() { + var tests = [ + { + desc: "success", + filepath: __dirname+"/examples/success/README.md", + assertion: function(err) { + assert.ifError(err); + } + }, + { + desc: "success_inner", + filepath: __dirname+"/examples/success_inner/README.md", + assertion: function(err) { + assert.ifError(err); + } + }, + { + desc: "success-multiple", + filepath: __dirname+"/examples/success-multiple/README.md", + assertion: function(err) { + assert.ifError(err); + } + }, + { + desc: "should test a markdown file in a nested folder", + filepath: __dirname+"/examples/nested_dirs/docs/documentation.md", + assertion: function(err) { + assert.ifError(err); + } + }, + { + desc: "fail", + filepath: __dirname+"/examples/fail/README.md", + assertion: function(err) { + assert(err); + } + }, + { + desc: "bash (experimental)", + filepath: __dirname+"/examples/bash/README.md", + opts: { + bash: true + }, + assertion: function(err) { + assert.ifError(err); + } + }, + { + desc: "main readme", + filepath: __dirname+"/../README.md", + assertion: function(err) { + assert.ifError(err); + } + }, - it("should test a markdown file in a nested folder", function(done) { - readtest(__dirname+"/examples/nested_dirs/docs/documentation.md", function(err) { - assert.ifError(err); - done(); - }); - }); + ]; - it("fail", function(done) { - readtest(__dirname+"/examples/fail/README.md", function(err) { - assert(err); - done(); - }); - }); - it("bash (experimental)", function(done) { - readtest(__dirname+"/examples/bash/README.md", {bash: true}, function(err) { - assert.ifError(err); - done(); + describe("callback", function() { + tests.forEach(function(test) { + it(test.desc, function(done) { + readtest(test.filepath, test.opts, function(err) { + test.assertion(err); + done(); + }); + }); }); }); - it("main readme", function(done) { - readtest(__dirname+"/../README.md", function(err) { - assert.ifError(err); - done(); + describe("promise", function() { + tests.forEach(function(test) { + it(test.desc, function() { + return readtest(test.filepath, test.opts) + .then(function() { + test.assertion(); + }) + .catch(function(err) { + test.assertion(err); + }) + }); }); }); });