Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions lib/rules/no-assert-equal.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,41 @@ module.exports = {
});
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {boolean}
*/
function isModuleHookCallback(propertyNode) {
return (
propertyNode.parent &&
propertyNode.parent.type === "Property" &&
utils.isModuleHookPropertyKey(propertyNode.parent.key) &&
utils.isInModule(propertyNode.parent)
);
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {void}
*/
function pushModuleHookAssert(propertyNode) {
if (isModuleHookCallback(propertyNode)) {
testStack.push({
assertVar: utils.getAssertContextName(propertyNode),
});
}
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {void}
*/
function popModuleHookAssert(propertyNode) {
if (isModuleHookCallback(propertyNode)) {
testStack.pop();
}
}

return {
CallExpression: function (node) {
/* istanbul ignore else: correctly does nothing */
Expand Down Expand Up @@ -188,6 +223,15 @@ module.exports = {
testStack.pop();
}
},

FunctionDeclaration: pushModuleHookAssert,
FunctionExpression: pushModuleHookAssert,
ArrowFunctionExpression: pushModuleHookAssert,

"FunctionDeclaration:exit": popModuleHookAssert,
"FunctionExpression:exit": popModuleHookAssert,
"ArrowFunctionExpression:exit": popModuleHookAssert,

Program: function (node) {
// Gather all calls to global `equal()`.
/* istanbul ignore next: deprecated code paths only followed by old eslint versions */
Expand Down
18 changes: 2 additions & 16 deletions lib/rules/no-qunit-start-in-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,6 @@ module.exports = {
);
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {boolean}
*/
function isInModule(propertyNode) {
return (
propertyNode &&
propertyNode.parent && // ObjectExpression
propertyNode.parent.parent && // CallExpression?
propertyNode.parent.parent.type === "CallExpression" &&
utils.isModule(propertyNode.parent.parent.callee)
);
}

//----------------------------------------------------------------------
// Public
//----------------------------------------------------------------------
Expand Down Expand Up @@ -93,7 +79,7 @@ module.exports = {
Property: function (node) {
if (
utils.isModuleHookPropertyKey(node.key) &&
isInModule(node) &&
utils.isInModule(node) &&
node.key.type === "Identifier"
) {
contextStack.push(`${node.key.name} hook`);
Expand All @@ -109,7 +95,7 @@ module.exports = {
"Property:exit": function (node) {
if (
utils.isModuleHookPropertyKey(node.key) &&
isInModule(node)
utils.isInModule(node)
) {
contextStack.pop();
}
Expand Down
16 changes: 1 addition & 15 deletions lib/rules/no-setup-teardown.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,25 +68,11 @@ module.exports = {
}
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {boolean}
*/
function isInModule(propertyNode) {
return (
propertyNode &&
propertyNode.parent && // ObjectExpression
propertyNode.parent.parent && // CallExpression?
propertyNode.parent.parent.type === "CallExpression" &&
utils.isModule(propertyNode.parent.parent.callee)
);
}

return {
Property: function (node) {
if (
utils.isModuleHookPropertyKey(node.key) &&
isInModule(node)
utils.isInModule(node)
) {
checkModuleHook(node);
}
Expand Down
18 changes: 2 additions & 16 deletions lib/rules/resolve-async.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,20 +159,6 @@ module.exports = {
}
}

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {boolean}
*/
function isInModule(propertyNode) {
return (
propertyNode &&
propertyNode.parent && // ObjectExpression
propertyNode.parent.parent && // CallExpression?
propertyNode.parent.parent.type === "CallExpression" &&
utils.isModule(propertyNode.parent.parent.callee)
);
}

return {
CallExpression: function (node) {
const callbackVar = getAsyncCallbackVarOrNull(node.callee);
Expand Down Expand Up @@ -213,7 +199,7 @@ module.exports = {
Property: function (node) {
if (
utils.isModuleHookPropertyKey(node.key) &&
isInModule(node)
utils.isInModule(node)
) {
asyncStateStack.push({
stopSemaphoreCount: 0,
Expand All @@ -228,7 +214,7 @@ module.exports = {
"Property:exit": function (node) {
if (
utils.isModuleHookPropertyKey(node.key) &&
isInModule(node)
utils.isInModule(node)
) {
const asyncState = asyncStateStack.pop();
if (!asyncState) {
Expand Down
14 changes: 14 additions & 0 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,20 @@ exports.isModule = function (calleeNode) {
return result;
};

/**
* @param {import('eslint').Rule.Node} propertyNode
* @returns {boolean}
*/
exports.isInModule = function (propertyNode) {
return (
propertyNode &&
propertyNode.parent && // ObjectExpression
propertyNode.parent.parent && // CallExpression?
propertyNode.parent.parent.type === "CallExpression" &&
exports.isModule(propertyNode.parent.parent.callee)
);
};

/**
* @param {import('estree').Node} identifierNode
* @returns {boolean}
Expand Down
24 changes: 24 additions & 0 deletions tests/lib/rules/no-assert-equal.js
Original file line number Diff line number Diff line change
Expand Up @@ -184,5 +184,29 @@ ruleTester.run("no-assert-equal", rule, {
},
],
},
{
// assert.equal in module hooks
code: "QUnit.module('My module', { beforeEach: function (assert) { assert.equal(1, 1); } });",
errors: [
{
messageId: "unexpectedAssertEqual",
data: { assertVar: "assert" },
suggestions: [
{
messageId: "switchToDeepEqual",
output: "QUnit.module('My module', { beforeEach: function (assert) { assert.deepEqual(1, 1); } });",
},
{
messageId: "switchToPropEqual",
output: "QUnit.module('My module', { beforeEach: function (assert) { assert.propEqual(1, 1); } });",
},
{
messageId: "switchToStrictEqual",
output: "QUnit.module('My module', { beforeEach: function (assert) { assert.strictEqual(1, 1); } });",
},
],
},
],
},
],
});