solid-code
Version:
JavaScript code quality front-end
91 lines (77 loc) • 2.6 kB
JavaScript
var fs = require('fs');
var path = require('path');
var check = require('check-types');
var tester = require('gt').TestingWithCoverage;
console.assert(tester, 'could not find test framework');
var _ = require('lodash');
check.verifyObject(tester, 'loaded tester module');
// returns test filename if finds one
function findTest(folder, basename) {
check.verifyString(folder, 'missing folder');
check.verifyString(basename, 'missing basename');
var extensions = ['.js', '.coffee'];
var candidateNames = [
path.join(folder, 'test', basename),
path.join(folder, 'test', basename + 'Test'),
path.join(folder, 'tests', basename + 'Test'),
path.join(folder, 'tests', basename),
path.join(folder, basename + 'Test'),
path.join(folder, basename + 'Tests')
];
var found = null;
candidateNames.some(function (name) {
return extensions.some(function (extension) {
var testName = name + extension;
if (fs.existsSync(testName)) {
found = testName;
return true;
}
});
});
return found;
}
function init(filenames) {
check.verifyArray(filenames, 'expect list of filenames');
var testFiles = [];
filenames.forEach(function (filename) {
// console.log('is', filename, 'solid?');
var fullName = path.resolve(filename);
console.assert(fs.existsSync(fullName), 'cannot find', fullName);
var folder = path.dirname(fullName);
var extension = path.extname(fullName);
console.assert(extension === '.js', fullName, 'does not end with .js');
var basename = path.basename(fullName, extension);
// console.log('base name', basename, 'in', folder);
var testName = findTest(folder, basename);
if (testName) {
check.verifyString(testName, 'expected filename test name');
testFiles.push(testName);
return;
}
throw new Error('cannot find test file for ' + fullName);
});
return testFiles;
}
// returns list of source and test files
function run(sourceFiles, callback) {
check.verifyArray(sourceFiles, 'expected a list of names');
check.verifyFunction(callback, 'expected callback function');
var testFiles = init(sourceFiles);
// console.log('source files', sourceFiles);
console.log('test files', testFiles);
var allFiles = _.uniq(sourceFiles.concat(testFiles));
if (allFiles.length < 1) {
console.log('no unit tests found');
} else {
tester.init({
log: 0,
files: allFiles,
colors: true,
cover: 'solid-code-coverage'
});
tester.run(function (failed) {
callback(failed, allFiles);
});
}
}
module.exports = run;