194 lines
4.7 KiB
JavaScript
194 lines
4.7 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
@module interfaces/common
|
||
|
*/
|
||
|
|
||
|
var Suite = require('../suite');
|
||
|
var errors = require('../errors');
|
||
|
var createMissingArgumentError = errors.createMissingArgumentError;
|
||
|
var createUnsupportedError = errors.createUnsupportedError;
|
||
|
var createForbiddenExclusivityError = errors.createForbiddenExclusivityError;
|
||
|
|
||
|
/**
|
||
|
* Functions common to more than one interface.
|
||
|
*
|
||
|
* @private
|
||
|
* @param {Suite[]} suites
|
||
|
* @param {Context} context
|
||
|
* @param {Mocha} mocha
|
||
|
* @return {Object} An object containing common functions.
|
||
|
*/
|
||
|
module.exports = function(suites, context, mocha) {
|
||
|
/**
|
||
|
* Check if the suite should be tested.
|
||
|
*
|
||
|
* @private
|
||
|
* @param {Suite} suite - suite to check
|
||
|
* @returns {boolean}
|
||
|
*/
|
||
|
function shouldBeTested(suite) {
|
||
|
return (
|
||
|
!mocha.options.grep ||
|
||
|
(mocha.options.grep &&
|
||
|
mocha.options.grep.test(suite.fullTitle()) &&
|
||
|
!mocha.options.invert)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
/**
|
||
|
* This is only present if flag --delay is passed into Mocha. It triggers
|
||
|
* root suite execution.
|
||
|
*
|
||
|
* @param {Suite} suite The root suite.
|
||
|
* @return {Function} A function which runs the root suite
|
||
|
*/
|
||
|
runWithSuite: function runWithSuite(suite) {
|
||
|
return function run() {
|
||
|
suite.run();
|
||
|
};
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Execute before running tests.
|
||
|
*
|
||
|
* @param {string} name
|
||
|
* @param {Function} fn
|
||
|
*/
|
||
|
before: function(name, fn) {
|
||
|
suites[0].beforeAll(name, fn);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Execute after running tests.
|
||
|
*
|
||
|
* @param {string} name
|
||
|
* @param {Function} fn
|
||
|
*/
|
||
|
after: function(name, fn) {
|
||
|
suites[0].afterAll(name, fn);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Execute before each test case.
|
||
|
*
|
||
|
* @param {string} name
|
||
|
* @param {Function} fn
|
||
|
*/
|
||
|
beforeEach: function(name, fn) {
|
||
|
suites[0].beforeEach(name, fn);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Execute after each test case.
|
||
|
*
|
||
|
* @param {string} name
|
||
|
* @param {Function} fn
|
||
|
*/
|
||
|
afterEach: function(name, fn) {
|
||
|
suites[0].afterEach(name, fn);
|
||
|
},
|
||
|
|
||
|
suite: {
|
||
|
/**
|
||
|
* Create an exclusive Suite; convenience function
|
||
|
* See docstring for create() below.
|
||
|
*
|
||
|
* @param {Object} opts
|
||
|
* @returns {Suite}
|
||
|
*/
|
||
|
only: function only(opts) {
|
||
|
if (mocha.options.forbidOnly) {
|
||
|
throw createForbiddenExclusivityError(mocha);
|
||
|
}
|
||
|
opts.isOnly = true;
|
||
|
return this.create(opts);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Create a Suite, but skip it; convenience function
|
||
|
* See docstring for create() below.
|
||
|
*
|
||
|
* @param {Object} opts
|
||
|
* @returns {Suite}
|
||
|
*/
|
||
|
skip: function skip(opts) {
|
||
|
opts.pending = true;
|
||
|
return this.create(opts);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Creates a suite.
|
||
|
*
|
||
|
* @param {Object} opts Options
|
||
|
* @param {string} opts.title Title of Suite
|
||
|
* @param {Function} [opts.fn] Suite Function (not always applicable)
|
||
|
* @param {boolean} [opts.pending] Is Suite pending?
|
||
|
* @param {string} [opts.file] Filepath where this Suite resides
|
||
|
* @param {boolean} [opts.isOnly] Is Suite exclusive?
|
||
|
* @returns {Suite}
|
||
|
*/
|
||
|
create: function create(opts) {
|
||
|
var suite = Suite.create(suites[0], opts.title);
|
||
|
suite.pending = Boolean(opts.pending);
|
||
|
suite.file = opts.file;
|
||
|
suites.unshift(suite);
|
||
|
if (opts.isOnly) {
|
||
|
suite.markOnly();
|
||
|
}
|
||
|
if (
|
||
|
suite.pending &&
|
||
|
mocha.options.forbidPending &&
|
||
|
shouldBeTested(suite)
|
||
|
) {
|
||
|
throw createUnsupportedError('Pending test forbidden');
|
||
|
}
|
||
|
if (typeof opts.fn === 'function') {
|
||
|
opts.fn.call(suite);
|
||
|
suites.shift();
|
||
|
} else if (typeof opts.fn === 'undefined' && !suite.pending) {
|
||
|
throw createMissingArgumentError(
|
||
|
'Suite "' +
|
||
|
suite.fullTitle() +
|
||
|
'" was defined but no callback was supplied. ' +
|
||
|
'Supply a callback or explicitly skip the suite.',
|
||
|
'callback',
|
||
|
'function'
|
||
|
);
|
||
|
} else if (!opts.fn && suite.pending) {
|
||
|
suites.shift();
|
||
|
}
|
||
|
|
||
|
return suite;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
test: {
|
||
|
/**
|
||
|
* Exclusive test-case.
|
||
|
*
|
||
|
* @param {Object} mocha
|
||
|
* @param {Function} test
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
only: function(mocha, test) {
|
||
|
if (mocha.options.forbidOnly) {
|
||
|
throw createForbiddenExclusivityError(mocha);
|
||
|
}
|
||
|
test.markOnly();
|
||
|
return test;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Pending test case.
|
||
|
*
|
||
|
* @param {string} title
|
||
|
*/
|
||
|
skip: function(title) {
|
||
|
context.test(title);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|