Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 51 additions & 37 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 || {};
Expand All @@ -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();
}
});
})
})
});
}
115 changes: 74 additions & 41 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -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);
})
});
});
});
});