Skip to content

Commit

Permalink
Merge pull request #126 from stefanbuck/parallel-support
Browse files Browse the repository at this point in the history
Add settings to enable support for mocha.parallel
  • Loading branch information
lo1tuma committed Mar 17, 2017
2 parents 86684eb + 69fe289 commit 6721d2e
Show file tree
Hide file tree
Showing 14 changed files with 282 additions and 27 deletions.
6 changes: 4 additions & 2 deletions lib/rules/max-top-level-suites.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@

var R = require('ramda'),
astUtil = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames,
defaultSuiteLimit = 1;

module.exports = function (context) {
var stack = [],
topLevelDescribes = [],
options = context.options[0] || {},
settings = context.settings,
suiteLimit;

if (R.isNil(options.limit)) {
Expand All @@ -23,13 +25,13 @@ module.exports = function (context) {

return {
CallExpression: function (node) {
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
stack.push(node);
}
},

'CallExpression:exit': function (node) {
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
if (stack.length === 1) {
topLevelDescribes.push(node);
}
Expand Down
6 changes: 4 additions & 2 deletions lib/rules/no-hooks-for-single-case.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var astUtil = require('../util/ast');
var astUtil = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames;

function newDescribeLayer(describeNode) {
return {
Expand All @@ -13,6 +14,7 @@ function newDescribeLayer(describeNode) {
module.exports = function (context) {
var options = context.options[0] || {},
allowedHooks = options.allow || [],
settings = context.settings,
layers = [];

function popLayer(node) {
Expand Down Expand Up @@ -40,7 +42,7 @@ module.exports = function (context) {
},

CallExpression: function (node) {
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
layers[layers.length - 1].testCount += 1;
layers.push(newDescribeLayer(node));
return;
Expand Down
15 changes: 10 additions & 5 deletions lib/rules/no-identical-title.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var astUtil = require('../util/ast');
var astUtil = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames;

function newLayer() {
return {
Expand All @@ -22,7 +23,9 @@ function handlTestCaseTitles(context, titles, node, title) {
}

function handlTestSuiteTitles(context, titles, node, title) {
if (!astUtil.isDescribe(node)) {
var settings = context.settings;

if (!astUtil.isDescribe(node, additionalSuiteNames(settings))) {
return;
}
if (titles.indexOf(title) !== -1) {
Expand All @@ -41,12 +44,14 @@ function isFirstArgLiteral(node) {
module.exports = function (context) {
var titleLayers = [
newLayer()
];
],
settings = context.settings;

return {
CallExpression: function (node) {
var currentLayer = titleLayers[titleLayers.length - 1],
title;
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
titleLayers.push(newLayer());
}
if (!isFirstArgLiteral(node)) {
Expand All @@ -58,7 +63,7 @@ module.exports = function (context) {
handlTestSuiteTitles(context, currentLayer.describeTitles, node, title);
},
'CallExpression:exit': function (node) {
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
titleLayers.pop();
}
}
Expand Down
8 changes: 5 additions & 3 deletions lib/rules/no-nested-tests.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
'use strict';

var astUtils = require('../util/ast');
var astUtils = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames;

module.exports = function noNestedTests(context) {
var testNestingLevel = 0;
var testNestingLevel = 0,
settings = context.settings;

function report(callExpression, isTestCase) {
var message = isTestCase ? 'Unexpected test nested within another test.' :
Expand All @@ -18,7 +20,7 @@ module.exports = function noNestedTests(context) {
return {
CallExpression: function (node) {
var isTestCase = astUtils.isTestCase(node),
isDescribe = astUtils.isDescribe(node);
isDescribe = astUtils.isDescribe(node, additionalSuiteNames(settings));

if (testNestingLevel > 0 && (isTestCase || isDescribe)) {
report(node, isTestCase);
Expand Down
8 changes: 5 additions & 3 deletions lib/rules/no-sibling-hooks.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var astUtil = require('../util/ast');
var astUtil = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames;

function newDescribeLayer(describeNode) {
return {
Expand All @@ -13,7 +14,8 @@ function newDescribeLayer(describeNode) {
}

module.exports = function (context) {
var isUsed = [];
var isUsed = [],
settings = context.settings;

return {
Program: function (node) {
Expand All @@ -22,7 +24,7 @@ module.exports = function (context) {

CallExpression: function (node) {
var name = node.callee && node.callee.name;
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
isUsed.push(newDescribeLayer(node));
return;
}
Expand Down
8 changes: 5 additions & 3 deletions lib/rules/no-top-level-hooks.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
'use strict';

var astUtil = require('../util/ast');
var astUtil = require('../util/ast'),
additionalSuiteNames = require('../util/settings').additionalSuiteNames;

module.exports = function (context) {
var testSuiteStack = [];
var settings = context.settings,
testSuiteStack = [];

return {
CallExpression: function (node) {
if (astUtil.isDescribe(node)) {
if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
testSuiteStack.push(node);
return;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/util/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ function getNodeName(node) {
return node.name;
}

function isDescribe(node) {
function isDescribe(node, additionalSuiteNames) {
return node
&& node.type === 'CallExpression'
&& describeAliases.indexOf(getNodeName(node.callee)) > -1;
&& describeAliases.concat(additionalSuiteNames).indexOf(getNodeName(node.callee)) > -1;
}

function isHookIdentifier(node) {
Expand Down
1 change: 1 addition & 0 deletions lib/util/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ function settingFor(propertyName) {

module.exports = {
getAdditionalTestFunctions: settingFor('additionalTestFunctions'),
additionalSuiteNames: settingFor('additionalSuiteNames'),
getAdditionalXFunctions: settingFor('additionalXFunctions')
};
34 changes: 34 additions & 0 deletions test/rules/max-top-level-suites.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ ruleTester.run('max-top-level-suites', rules['max-top-level-suites'], {
options: [ { } ],
code: 'someOtherFunction();'
},
{
code: 'foo("This is a test", function () { });',
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
}
}, {
code: 'foo("This is a test", function () { });',
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
}
},
'someOtherFunction();'
],

Expand Down Expand Up @@ -151,6 +164,27 @@ ruleTester.run('max-top-level-suites', rules['max-top-level-suites'], {
errors: [
{ message: 'The number of top-level suites is more than 1.' }
]
},
{
code: 'foo("this is a test", function () { });' +
'foo("this is a different test", function () { });',
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
},
errors: [
{ message: 'The number of top-level suites is more than 1.' }
]
}, {
code: 'foo("this is a test", function () { });' +
'foo("this is a different test", function () { });',
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
},
errors: [
{ message: 'The number of top-level suites is more than 1.' }
]
}
]
});
50 changes: 50 additions & 0 deletions test/rules/no-hooks-for-single-case.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,32 @@ ruleTester.run('no-hooks-for-single-case', rules['no-hooks-for-single-case'], {
'});'
].join('\n'),
options: [ { allow: [ 'after', 'afterEach' ] } ]
},
{
code: [
'foo(function() {',
' before(function() {});',
' it(function() {});',
' it(function() {});',
'});'
].join('\n'),
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
}
},
{
code: [
'foo(function() {',
' before(function() {});',
' it(function() {});',
' it(function() {});',
'});'
].join('\n'),
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
}
}
],

Expand Down Expand Up @@ -258,6 +284,30 @@ ruleTester.run('no-hooks-for-single-case', rules['no-hooks-for-single-case'], {
].join('\n'),
options: [ { allow: [ 'before' ] } ],
errors: [ { message: 'Unexpected use of Mocha `after` hook for a single test case', column: 5, line: 2 } ]
},
{
code: [
'foo(function() {',
' before(function() {});',
'});'
].join('\n'),
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
},
errors: [ { message: 'Unexpected use of Mocha `before` hook for a single test case', column: 5, line: 2 } ]
},
{
code: [
'foo(function() {',
' before(function() {});',
'});'
].join('\n'),
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
},
errors: [ { message: 'Unexpected use of Mocha `before` hook for a single test case', column: 5, line: 2 } ]
}
]

Expand Down
44 changes: 42 additions & 2 deletions test/rules/no-identical-title.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,26 @@ ruleTester.run('no-identical-title', rules['no-identical-title'], {
' describe("describe2", function() {});',
' });',
'});'
].join('\n')
].join('\n'),
{
code: [
'foo("describe1", function() {});',
'foo("describe2", function() {});'
].join('\n'),
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
}
}, {
code: [
'foo("describe1", function() {});',
'foo("describe2", function() {});'
].join('\n'),
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
}
}
],

invalid: [
Expand Down Expand Up @@ -154,7 +173,28 @@ ruleTester.run('no-identical-title', rules['no-identical-title'], {
'describe("describe1", function() {});'
].join('\n'),
errors: [ { message: 'Test suite title is used multiple times.', column: 1, line: 4 } ]
}
},
{
code: [
'foo("describe1", function() {});',
'foo("describe1", function() {});'
].join('\n'),
settings: {
'mocha/additionalSuiteNames': [ 'foo' ]
},
errors: [ { message: 'Test suite title is used multiple times.', column: 1, line: 2 } ]
}, {
code: [
'foo("describe1", function() {});',
'foo("describe1", function() {});'
].join('\n'),
settings: {
mocha: {
additionalSuiteNames: [ 'foo' ]
}
},
errors: [ { message: 'Test suite title is used multiple times.', column: 1, line: 2 } ]
}
]

});

0 comments on commit 6721d2e

Please sign in to comment.