2015-02-23 23:39:20 -08:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
var fs = require("fs");
|
|
|
|
var path = require("path");
|
2015-03-12 23:42:06 -07:00
|
|
|
var Q = require("q");
|
2015-02-23 23:39:20 -08:00
|
|
|
var markdownlint = require("../lib/markdownlint");
|
2015-03-08 23:08:43 -07:00
|
|
|
var shared = require("../lib/shared");
|
2015-02-27 22:06:54 -08:00
|
|
|
|
2015-02-23 23:39:20 -08:00
|
|
|
function createTestForFile(file) {
|
2015-02-24 18:40:37 -08:00
|
|
|
return function testForFile(test) {
|
2015-03-01 22:15:02 -08:00
|
|
|
test.expect(1);
|
|
|
|
var configFile = file.replace(/\.md$/, ".json");
|
|
|
|
var actualPromise = Q.nfcall(fs.stat, configFile)
|
|
|
|
.then(
|
|
|
|
function configFileExists() {
|
2015-03-15 23:39:17 -07:00
|
|
|
return Q.nfcall(fs.readFile, configFile, shared.utf8Encoding)
|
2015-03-01 22:15:02 -08:00
|
|
|
.then(
|
|
|
|
function configFileContents(contents) {
|
|
|
|
return JSON.parse(contents);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
function noConfigFile() {
|
|
|
|
return null;
|
|
|
|
})
|
|
|
|
.then(
|
|
|
|
function lintWithConfig(config) {
|
|
|
|
return Q.nfcall(markdownlint, {
|
|
|
|
"files": [ file ],
|
|
|
|
"config": config
|
|
|
|
});
|
|
|
|
});
|
2015-03-15 23:39:17 -07:00
|
|
|
var expectedPromise = Q.nfcall(fs.readFile, file, shared.utf8Encoding)
|
2015-03-01 22:15:02 -08:00
|
|
|
.then(
|
|
|
|
function fileContents(contents) {
|
2015-03-08 23:08:43 -07:00
|
|
|
var lines = contents.split(shared.newLineRe);
|
2015-02-27 22:06:54 -08:00
|
|
|
var results = {};
|
|
|
|
lines.forEach(function forLine(line, lineNum) {
|
2015-03-04 18:09:46 -08:00
|
|
|
var regex = /\{(MD\d+)(?::(\d+))?\}/g;
|
|
|
|
var match;
|
|
|
|
while ((match = regex.exec(line))) {
|
2015-02-27 22:06:54 -08:00
|
|
|
var rule = match[1];
|
|
|
|
var errors = results[rule] || [];
|
2015-03-04 18:09:46 -08:00
|
|
|
errors.push(match[2] ? parseInt(match[2], 10) : lineNum + 1);
|
2015-02-27 22:06:54 -08:00
|
|
|
results[rule] = errors;
|
|
|
|
}
|
|
|
|
});
|
2015-03-17 18:02:05 -07:00
|
|
|
var sortedResults = {};
|
|
|
|
Object.keys(results).sort().forEach(function forKey(key) {
|
|
|
|
sortedResults[key] = results[key];
|
|
|
|
});
|
|
|
|
return sortedResults;
|
2015-02-24 18:40:37 -08:00
|
|
|
});
|
2015-03-01 22:15:02 -08:00
|
|
|
Q.all([ actualPromise, expectedPromise ])
|
|
|
|
.then(
|
|
|
|
function compareResults(fulfillments) {
|
|
|
|
var actual = fulfillments[0];
|
|
|
|
var results = fulfillments[1];
|
|
|
|
var expected = {};
|
|
|
|
expected[file] = results;
|
|
|
|
test.deepEqual(actual, expected, "Line numbers are not correct.");
|
|
|
|
})
|
|
|
|
.done(test.done, test.done);
|
2015-02-23 23:39:20 -08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2015-02-24 18:40:37 -08:00
|
|
|
/* eslint-disable no-sync, for synchronous test method creation */
|
|
|
|
fs.readdirSync(__dirname).forEach(function forFile(file) {
|
|
|
|
/* eslint-enable no-sync */
|
2015-02-23 23:39:20 -08:00
|
|
|
if (file.match(/\.md$/)) {
|
|
|
|
module.exports[file] = createTestForFile(path.join(__dirname, file));
|
|
|
|
}
|
|
|
|
});
|
2015-03-11 21:13:21 -07:00
|
|
|
|
2015-03-12 23:42:06 -07:00
|
|
|
module.exports.projectFiles = function projectFiles(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [ "README.md" ]
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actual) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expected = { "README.md": {} };
|
|
|
|
test.deepEqual(actual, expected, "Issue(s) with project files.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-13 09:13:07 -07:00
|
|
|
module.exports.resultFormatting = function resultFormatting(test) {
|
|
|
|
test.expect(3);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
]
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD002": [ 3 ],
|
|
|
|
"MD018": [ 1 ],
|
|
|
|
"MD019": [ 3, 5 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {
|
|
|
|
"MD002": [ 1 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
var actualMessage = actualResult.toString();
|
|
|
|
var expectedMessage =
|
|
|
|
"./test/atx_header_spacing.md: 3: MD002" +
|
|
|
|
" First header should be a h1 header\n" +
|
|
|
|
"./test/atx_header_spacing.md: 1: MD018" +
|
|
|
|
" No space after hash on atx style header\n" +
|
|
|
|
"./test/atx_header_spacing.md: 3: MD019" +
|
|
|
|
" Multiple spaces after hash on atx style header\n" +
|
|
|
|
"./test/atx_header_spacing.md: 5: MD019" +
|
|
|
|
" Multiple spaces after hash on atx style header\n" +
|
|
|
|
"./test/first_header_bad_atx.md: 1: MD002" +
|
|
|
|
" First header should be a h1 header";
|
|
|
|
test.equal(actualMessage, expectedMessage, "Incorrect message.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-16 23:25:06 -07:00
|
|
|
module.exports.defaultTrue = function defaultTrue(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"default": true
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD002": [ 3 ],
|
|
|
|
"MD018": [ 1 ],
|
|
|
|
"MD019": [ 3, 5 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {
|
|
|
|
"MD002": [ 1 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.defaultFalse = function defaultFalse(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"default": false
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {},
|
|
|
|
"./test/first_header_bad_atx.md": {}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.disableRules = function disableRules(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"MD002": false,
|
|
|
|
"default": true,
|
|
|
|
"MD019": false
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD018": [ 1 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.enableRules = function enableRules(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"MD002": true,
|
|
|
|
"default": false,
|
|
|
|
"MD019": true
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD002": [ 3 ],
|
|
|
|
"MD019": [ 3, 5 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {
|
|
|
|
"MD002": [ 1 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.disableTag = function disableTag(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"default": true,
|
|
|
|
"spaces": false
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD002": [ 3 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {
|
|
|
|
"MD002": [ 1 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.enableTag = function enableTag(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
],
|
|
|
|
"config": {
|
|
|
|
"default": false,
|
|
|
|
"spaces": true
|
|
|
|
}
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/atx_header_spacing.md": {
|
|
|
|
"MD018": [ 1 ],
|
|
|
|
"MD019": [ 3, 5 ]
|
|
|
|
},
|
|
|
|
"./test/first_header_bad_atx.md": {}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-17 18:02:05 -07:00
|
|
|
module.exports.styleAll = function styleAll(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [ "./test/break-all-the-rules.md" ],
|
|
|
|
"config": require("../style/all.json")
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/break-all-the-rules.md": {
|
|
|
|
"MD001": [ 3 ],
|
|
|
|
"MD002": [ 1 ],
|
|
|
|
"MD003": [ 5, 30 ],
|
|
|
|
"MD004": [ 8 ],
|
|
|
|
"MD005": [ 12 ],
|
|
|
|
"MD006": [ 8 ],
|
|
|
|
"MD007": [ 8, 11 ],
|
|
|
|
"MD009": [ 14 ],
|
|
|
|
"MD010": [ 14 ],
|
|
|
|
"MD011": [ 16 ],
|
|
|
|
"MD012": [ 18 ],
|
|
|
|
"MD013": [ 21 ],
|
|
|
|
"MD014": [ 23 ],
|
|
|
|
"MD018": [ 25 ],
|
|
|
|
"MD019": [ 27 ],
|
|
|
|
"MD020": [ 29 ],
|
|
|
|
"MD021": [ 30 ],
|
|
|
|
"MD022": [ 30 ],
|
|
|
|
"MD023": [ 30 ],
|
|
|
|
"MD024": [ 34 ],
|
|
|
|
"MD026": [ 40 ],
|
|
|
|
"MD027": [ 42 ],
|
|
|
|
"MD028": [ 43 ],
|
|
|
|
"MD029": [ 47 ],
|
|
|
|
"MD030": [ 8 ],
|
|
|
|
"MD031": [ 50 ],
|
|
|
|
"MD032": [ 51 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.styleRelaxed = function styleRelaxed(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var options = {
|
|
|
|
"files": [ "./test/break-all-the-rules.md" ],
|
|
|
|
"config": require("../style/relaxed.json")
|
|
|
|
};
|
|
|
|
markdownlint(options, function callback(err, actualResult) {
|
|
|
|
test.ifError(err);
|
|
|
|
var expectedResult = {
|
|
|
|
"./test/break-all-the-rules.md": {
|
|
|
|
"MD001": [ 3 ],
|
|
|
|
"MD002": [ 1 ],
|
|
|
|
"MD003": [ 5, 30 ],
|
|
|
|
"MD004": [ 8 ],
|
|
|
|
"MD005": [ 12 ],
|
|
|
|
"MD011": [ 16 ],
|
|
|
|
"MD014": [ 23 ],
|
|
|
|
"MD018": [ 25 ],
|
|
|
|
"MD019": [ 27 ],
|
|
|
|
"MD020": [ 29 ],
|
|
|
|
"MD021": [ 30 ],
|
|
|
|
"MD022": [ 30 ],
|
|
|
|
"MD023": [ 30 ],
|
|
|
|
"MD024": [ 34 ],
|
|
|
|
"MD026": [ 40 ],
|
|
|
|
"MD029": [ 47 ],
|
|
|
|
"MD031": [ 50 ],
|
|
|
|
"MD032": [ 51 ]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
test.deepEqual(actualResult, expectedResult, "Undetected issues.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-13 18:20:56 -07:00
|
|
|
module.exports.filesNotModified = function filesNotModified(test) {
|
|
|
|
test.expect(2);
|
|
|
|
var files = [
|
|
|
|
"./test/atx_header_spacing.md",
|
|
|
|
"./test/first_header_bad_atx.md"
|
|
|
|
];
|
|
|
|
var expectedFiles = files.slice();
|
|
|
|
markdownlint({ "files": files }, function callback(err) {
|
|
|
|
test.ifError(err);
|
|
|
|
test.deepEqual(files, expectedFiles, "Files modified.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-11 21:13:21 -07:00
|
|
|
module.exports.missingOptions = function missingOptions(test) {
|
|
|
|
test.expect(2);
|
|
|
|
markdownlint(null, function callback(err, result) {
|
|
|
|
test.ifError(err);
|
|
|
|
test.ok(result, "Did not get result for missing options.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.missingFiles = function missingFiles(test) {
|
|
|
|
test.expect(2);
|
|
|
|
markdownlint({}, function callback(err, result) {
|
|
|
|
test.ifError(err);
|
|
|
|
test.ok(result, "Did not get result for missing files.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.missingCallback = function missingCallback(test) {
|
|
|
|
test.expect(0);
|
|
|
|
markdownlint();
|
|
|
|
test.done();
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.badFile = function badFile(test) {
|
|
|
|
test.expect(3);
|
|
|
|
markdownlint({
|
|
|
|
"files": [ "./badFile" ]
|
|
|
|
}, function callback(err, result) {
|
|
|
|
test.ok(err, "Did not get an error for bad file.");
|
|
|
|
test.equal(err.code, "ENOENT", "Error code for bad file not ENOENT.");
|
|
|
|
test.ok(!result, "Got result for bad file.");
|
|
|
|
test.done();
|
|
|
|
});
|
|
|
|
};
|