Add test to verify parameters in docs match code.

This commit is contained in:
David Anson 2015-12-13 21:42:51 -08:00
parent d5050beafa
commit 410da18a2c

View file

@ -755,13 +755,22 @@ module.exports.readme = function readme(test) {
}; };
module.exports.doc = function doc(test) { module.exports.doc = function doc(test) {
test.expect(151); test.expect(199);
fs.readFile("doc/Rules.md", shared.utf8Encoding, fs.readFile("doc/Rules.md", shared.utf8Encoding,
function readFile(err, contents) { function readFile(err, contents) {
test.ifError(err); test.ifError(err);
var rulesLeft = rules.slice(); var rulesLeft = rules.slice();
var inHeading = false; var inHeading = false;
var rule = null; var rule = null;
var ruleHasTags = true;
var ruleUsesParams = null;
var tagParameterRe = /, |: | /;
function testTagsAndParams() {
test.ok(ruleHasTags,
"Missing tags for rule " + (rule || {}).name + ".");
test.ok(!ruleUsesParams,
"Missing parameters for rule " + (rule || {}).name + ".");
}
md.parse(contents, {}).forEach(function forToken(token) { md.parse(contents, {}).forEach(function forToken(token) {
if ((token.type === "heading_open") && (token.tag === "h2")) { if ((token.type === "heading_open") && (token.tag === "h2")) {
inHeading = true; inHeading = true;
@ -769,27 +778,43 @@ module.exports.doc = function doc(test) {
inHeading = false; inHeading = false;
} else if (token.type === "inline") { } else if (token.type === "inline") {
if (inHeading) { if (inHeading) {
test.ok(!rule, testTagsAndParams();
"Missing tags for rule " + (rule || {}).name + ".");
rule = rulesLeft.shift(); rule = rulesLeft.shift();
ruleHasTags = false;
test.ok(rule, test.ok(rule,
"Missing rule implementation for " + token.content + "."); "Missing rule implementation for " + token.content + ".");
if (rule) { test.equal(token.content, rule.name + " - " + rule.desc,
var expected = rule.name + " - " + rule.desc; "Rule mismatch.");
test.equal(token.content, expected, "Rule mismatch."); ruleUsesParams = rule.func.toString()
.match(/params\.options\.[_a-z]*/gi);
if (ruleUsesParams) {
ruleUsesParams = ruleUsesParams.map(function forUse(use) {
return use.split(".").pop();
});
} }
} else if (/^Tags: /.test(token.content) && rule) { } else if (/^Tags: /.test(token.content) && rule) {
var tags = token.content.split(/, |: | /).slice(1); var tags = token.content.split(tagParameterRe).slice(1);
test.deepEqual(tags, rule.tags, test.deepEqual(tags, rule.tags,
"Tag mismatch for rule " + rule.name + "."); "Tag mismatch for rule " + rule.name + ".");
rule = null; ruleHasTags = true;
} else if (/^Parameters: /.test(token.content) && rule) {
var inDetails = false;
var parameters = token.content.split(tagParameterRe)
.slice(1)
.filter(function forPart(part) {
inDetails = inDetails || (part[0] === "(");
return !inDetails;
});
test.deepEqual(parameters, ruleUsesParams,
"Missing parameter for rule " + rule.name);
ruleUsesParams = null;
} }
} }
}); });
var ruleLeft = rulesLeft.shift(); var ruleLeft = rulesLeft.shift();
test.ok(!ruleLeft, test.ok(!ruleLeft,
"Missing rule documentation for " + (ruleLeft || {}).name + "."); "Missing rule documentation for " + (ruleLeft || {}).name + ".");
test.ok(!rule, "Missing tags for rule " + (rule || {}).name + "."); testTagsAndParams();
test.done(); test.done();
}); });
}; };