109 lines
2.6 KiB
JavaScript
109 lines
2.6 KiB
JavaScript
var path = require('path');
|
|
var minimatch = require('minimatch');
|
|
|
|
function adaptFilePath(srcPath, excludedPath) {
|
|
var resolved = path.resolve(excludedPath);
|
|
|
|
if (resolved.indexOf(srcPath) === 0) {
|
|
return resolved;
|
|
}
|
|
|
|
if (excludedPath.charAt(excludedPath.length-1) === path.sep) {
|
|
excludedPath = excludedPath.substring(0, excludedPath.length-1);
|
|
}
|
|
return path.join(srcPath, excludedPath);
|
|
}
|
|
|
|
function matchFilePath(filePath, pathArr) {
|
|
for (var i = 0; i < pathArr.length; i++) {
|
|
if (minimatch(filePath, pathArr[i])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
module.exports = {
|
|
tags: {
|
|
/**
|
|
* @param {string} testFilePath - file path of a test
|
|
* @param {object} opts - test options
|
|
* @returns {boolean} true if specified test matches given tag
|
|
*/
|
|
match : function (testFilePath, opts) {
|
|
var test;
|
|
|
|
try {
|
|
test = require(testFilePath);
|
|
} catch (e) {
|
|
// could not load test module
|
|
return false;
|
|
}
|
|
|
|
return this.checkModuleTags(test, opts);
|
|
},
|
|
|
|
/**
|
|
* @param {object} test - test module
|
|
* @param {object} opts - test options
|
|
* @returns {boolean}
|
|
*/
|
|
checkModuleTags: function (test, opts) {
|
|
var moduleTags = test['@tags'] || test.tags;
|
|
var match = true;
|
|
|
|
if (!Array.isArray(moduleTags)) {
|
|
return typeof opts.tag_filter == 'undefined' && typeof opts.skiptags != 'undefined';
|
|
}
|
|
|
|
if (opts.tag_filter || opts.skiptags){
|
|
moduleTags = this.convertTagsToString(moduleTags);
|
|
|
|
if (opts.tag_filter) {
|
|
match = this.containsTag(moduleTags, this.convertTagsToString(opts.tag_filter));
|
|
}
|
|
if (opts.skiptags) {
|
|
match = this.excludesTag(moduleTags, this.convertTagsToString(opts.skiptags));
|
|
}
|
|
}
|
|
|
|
return match;
|
|
},
|
|
|
|
convertTagsToString : function(tags) {
|
|
return [].concat(tags).map(function (tag) {
|
|
return String(tag).toLowerCase();
|
|
});
|
|
},
|
|
|
|
containsTag : function(moduleTags, tags) {
|
|
return moduleTags.some(function (testTag) {
|
|
return (tags.indexOf(testTag) > -1);
|
|
});
|
|
},
|
|
|
|
excludesTag : function(moduleTags, tags) {
|
|
return moduleTags.every(function (testTag) {
|
|
return (tags.indexOf(testTag) == -1);
|
|
});
|
|
}
|
|
},
|
|
|
|
exclude : {
|
|
adaptFilePath : function(filePath, excludedPath) {
|
|
if (!Array.isArray(excludedPath)) {
|
|
excludedPath = [excludedPath];
|
|
}
|
|
return excludedPath.map(function(item) {
|
|
return adaptFilePath(filePath, item);
|
|
});
|
|
},
|
|
match : matchFilePath
|
|
},
|
|
|
|
filter : {
|
|
adaptFilePath : adaptFilePath,
|
|
match : matchFilePath
|
|
}
|
|
};
|