UNPKG

1.93 kBJavaScriptView Raw
1'use strict';
2
3const astUtil = require('../util/ast');
4const { additionalSuiteNames } = require('../util/settings');
5
6function newLayer() {
7 return {
8 describeTitles: [],
9 testTitles: []
10 };
11}
12
13function handlTestCaseTitles(context, titles, node, title) {
14 if (astUtil.isTestCase(node)) {
15 if (titles.indexOf(title) !== -1) {
16 context.report({
17 node,
18 message: 'Test title is used multiple times in the same test suite.'
19 });
20 }
21 titles.push(title);
22 }
23}
24
25function handlTestSuiteTitles(context, titles, node, title) {
26 const settings = context.settings;
27
28 if (!astUtil.isDescribe(node, additionalSuiteNames(settings))) {
29 return;
30 }
31 if (titles.indexOf(title) !== -1) {
32 context.report({
33 node,
34 message: 'Test suite title is used multiple times.'
35 });
36 }
37 titles.push(title);
38}
39
40function isFirstArgLiteral(node) {
41 return node.arguments && node.arguments[0] && node.arguments[0].type === 'Literal';
42}
43
44module.exports = function (context) {
45 const titleLayers = [ newLayer() ];
46 const settings = context.settings;
47
48 return {
49 CallExpression(node) {
50 const currentLayer = titleLayers[titleLayers.length - 1];
51
52 if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
53 titleLayers.push(newLayer());
54 }
55 if (!isFirstArgLiteral(node)) {
56 return;
57 }
58
59 const title = node.arguments[0].value;
60 handlTestCaseTitles(context, currentLayer.testTitles, node, title);
61 handlTestSuiteTitles(context, currentLayer.describeTitles, node, title);
62 },
63 'CallExpression:exit'(node) {
64 if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
65 titleLayers.pop();
66 }
67 }
68 };
69};