| '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); |
| } |
| } |
| }; |
| }; |