rttc
Version:
Runtime type-checking for JavaScript.
103 lines (86 loc) • 2.54 kB
JavaScript
/**
* Module dependencies
*/
var util = require('util');
var _ = require('@sailshq/lodash');
var getDisplayType = require('../../lib/get-display-type');
module.exports = function runSuite( testSuite, runTestFn ){
// Run each test.
_.each(testSuite, function (test){
describeAndExecuteTest(test, runTestFn);
});
};
/**
* Describe a mocha test based on the provided definition.
*
* @param {[type]} test [description]
* @return {[type]} [description]
*/
function describeAndExecuteTest(test, runTestFn){
if (test.strictEq && test.isNew) {
throw new Error('INVALID TEST: `isNew` and `strictEq` are mutually exclusive opposites- cannot use them together. For reference, this is test:\n'+util.inspect(test, false, null));
}
var actualDisplayName = getDisplayVal(test.actual);
describe((function _determineDescribeMsg(){
var msg = '';
if (test._meta) {
msg += '['+test._meta+']';
}
else {
msg += ' ';
}
if (!_.isUndefined(test.example)) {
msg += 'with a '+getDisplayType(test.example)+' example ('+getDisplayVal(test.example)+')';
}
else if (!_.isUndefined(test.typeclass)) {
msg += 'with typeclass===`'+test.typeclass+'`';
}
else {
msg +='with example===`undefined`';
}
return msg;
})(), function suite (){
if (test.error) {
it(util.format('should error when %s is provided', actualDisplayName), function (done){
runTestFn(test, done);
});
return;
}
var itMsg = 'should ';
if (test.strictEq) {
itMsg+='maintain strict equality (===) when ' + actualDisplayName + ' is provided';
}
else if (test.isNew) {
if (test.hasOwnProperty('result')) {
itMsg+='convert ' + actualDisplayName + ' into a new (!== original) value '+util.inspect(test.result, false, null);
}
else {
itMsg+='take ' + actualDisplayName + ' and yield a copy (which !== original)';
}
}
else {
itMsg+='convert ' + actualDisplayName + ' into '+getDisplayVal(test.result) + ' (a '+getDisplayType(test.result)+')';
}
it(itMsg, function (done){
runTestFn(test, done);
});
});
}
function getDisplayVal(v){
if (_.isDate(v)) {
return 'a Date';
}
if (_.isFunction(v)) {
return v.toString();
}
if (_.isError(v)) {
return 'an Error';
}
if (_.isRegExp(v)) {
return 'a RegExp';
}
if (!_.isPlainObject(v) && !_.isArray(v)) {
return getDisplayType(v);
}
return util.inspect(v,false,null);
}