UNPKG

2.84 kBJavaScriptView Raw
1'use strict';
2
3var _sprintfJs = require('sprintf-js');
4
5function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
6
7module.exports = forEach;
8
9/**
10 * Defines Mocha test cases for each given parameter.
11 * @param {Array} parameters
12 * @param {function} defaultIt - The 'it' function used in this function.
13 * If omitted, 'it' in global name space is used.
14 * @return {Object} The object which has a method to define test cases.
15 */
16function forEach(parameters) {
17 var defaultIt = arguments.length <= 1 || arguments[1] === undefined ? global.it : arguments[1];
18
19 var it = makeTestCaseDefiner(parameters, defaultIt);
20 it.skip = makeParameterizedSkip(parameters, defaultIt);
21 it.only = makeParameterizedOnly(parameters, defaultIt);
22 return { it: it };
23}
24
25/**
26 * Create a function which define parameterized tests
27 * to be ignored.
28 * @private
29 */
30function makeParameterizedSkip(parameters, defaultIt) {
31 return makeTestCaseDefiner(parameters, defaultIt ? defaultIt.skip : undefined);
32}
33
34/**
35 * Create a function which define exclusive parameterized tests.
36 * @private
37 */
38function makeParameterizedOnly(parameters, defaultIt) {
39 return function (title, test) {
40 var it = makeTestCaseDefiner(parameters, defaultIt);
41 global.describe.only('', function () {
42 return it(title, test);
43 });
44 };
45}
46
47/**
48 * Create a function which defines test cases for
49 * each given parameter.
50 * @private
51 */
52function makeTestCaseDefiner(parameters, it) {
53 return function defineTestCases(title, test) {
54 var makeTitle = typeof title === 'function' ? title : function () {
55 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
56 args[_key] = arguments[_key];
57 }
58
59 return (0, _sprintfJs.vsprintf)(title, args);
60 };
61
62 var arrayParams = parameters.map(function (param) {
63 return Array.isArray(param) ? param : [param];
64 });
65
66 var isAsync = isAsyncTest(arrayParams, test);
67 arrayParams.forEach(function (param, index) {
68 it(makeTitle.apply(undefined, [].concat(_toConsumableArray(param), [index])), makeTestBody(param, test, isAsync));
69 });
70 };
71}
72
73/**
74 * Wrap a given test function and convert it to
75 * a function passed to the `it`.
76 * @private
77 */
78function makeTestBody(param, test, isAsync) {
79 if (isAsync) {
80 return function (done) {
81 test.apply(this, param.concat(done));
82 };
83 }
84 return function () {
85 test.apply(this, param);
86 };
87}
88
89/**
90 * Return true if the testBody seems to be async.
91 * @private
92 */
93function isAsyncTest(parameters, test) {
94 var nLongestParam = parameters.reduce(function (n, param) {
95 return Math.max(n, param.length);
96 }, 0);
97 return nLongestParam < test.length;
98}
\No newline at end of file