UNPKG

eslint-plugin-mocha

Version:

Eslint rules for mocha.

73 lines 2.56 kB
import { createMochaVisitors } from '../ast/mocha-visitors.js'; import { isCallExpression, isLiteral } from '../ast/node-types.js'; import { getLastOrThrow } from '../list.js'; function newLayer() { return { suiteTitles: [], testTitles: [] }; } function extractTitleArgument(node) { if (isCallExpression(node)) { const [firstArg] = node.arguments; if (firstArg !== undefined && isLiteral(firstArg)) { return firstArg.value?.toString() ?? null; } } return null; } export const noIdenticalTitleRule = { meta: { type: 'suggestion', docs: { description: 'Disallow identical titles', url: 'https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-identical-title.md' }, schema: [] }, create(context) { const titleLayers = [newLayer()]; function handleTestCaseTitles(visitorContext, title) { const currentLayer = getLastOrThrow(titleLayers); const titles = currentLayer.testTitles; if (titles.includes(title)) { context.report({ node: visitorContext.node, message: 'Test title is used multiple times in the same test suite.' }); } titles.push(title); } function handleTestSuiteTitles(visitorContext, title) { const currentLayer = getLastOrThrow(titleLayers); const titles = currentLayer.suiteTitles; if (titles.includes(title)) { context.report({ node: visitorContext.node, message: 'Test suite title is used multiple times.' }); } titles.push(title); } return createMochaVisitors(context, { suite(visitorContext) { const title = extractTitleArgument(visitorContext.node); if (title !== null) { handleTestSuiteTitles(visitorContext, title); } titleLayers.push(newLayer()); }, 'suite:exit'() { titleLayers.pop(); }, testCase(visitorContext) { const title = extractTitleArgument(visitorContext.node); if (title === null) { return; } handleTestCaseTitles(visitorContext, title); } }); } }; //# sourceMappingURL=no-identical-title.js.map