vitest-cucumber-plugin 0.5.6 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASE_NOTES.md +3 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/generate/example.d.ts +5 -0
- package/dist/generate/example.d.ts.map +1 -0
- package/dist/generate/example.js +18 -0
- package/dist/generate/example.js.map +1 -0
- package/dist/generate/examples.d.ts +5 -0
- package/dist/generate/examples.d.ts.map +1 -0
- package/dist/generate/examples.js +46 -0
- package/dist/generate/examples.js.map +1 -0
- package/dist/generate/feature.d.ts +10 -0
- package/dist/generate/feature.d.ts.map +1 -0
- package/dist/generate/feature.js +77 -0
- package/dist/generate/feature.js.map +1 -0
- package/dist/generate/index.d.ts +3 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +3 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/rule.d.ts +5 -0
- package/dist/generate/rule.d.ts.map +1 -0
- package/dist/generate/rule.js +19 -0
- package/dist/generate/rule.js.map +1 -0
- package/dist/generate/scenario-outline.d.ts +5 -0
- package/dist/generate/scenario-outline.d.ts.map +1 -0
- package/dist/generate/scenario-outline.js +18 -0
- package/dist/generate/scenario-outline.js.map +1 -0
- package/dist/generate/tests.d.ts +4 -0
- package/dist/generate/tests.d.ts.map +1 -0
- package/{src → dist}/generate/tests.js +10 -10
- package/dist/generate/tests.js.map +1 -0
- package/dist/generate/util.d.ts +6 -0
- package/dist/generate/util.d.ts.map +1 -0
- package/dist/generate/util.js +9 -0
- package/dist/generate/util.js.map +1 -0
- package/dist/gherkin-languages.json +3790 -0
- package/dist/gherkin-lexer-shared.d.ts +6 -0
- package/dist/gherkin-lexer-shared.d.ts.map +1 -0
- package/dist/gherkin-lexer-shared.js +4 -0
- package/dist/gherkin-lexer-shared.js.map +1 -0
- package/dist/gherkin-lexer.d.ts +4 -0
- package/dist/gherkin-lexer.d.ts.map +1 -0
- package/dist/gherkin-lexer.js +68 -0
- package/dist/gherkin-lexer.js.map +1 -0
- package/{src → dist}/gherkin.js +24 -31
- package/{src → dist}/gherkin.umd.js +23 -31
- package/dist/hooks.d.ts +25 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +94 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +8 -0
- package/dist/logger.js.map +1 -0
- package/dist/parameterize.d.ts +3 -0
- package/dist/parameterize.d.ts.map +1 -0
- package/dist/parameterize.js +8 -0
- package/dist/parameterize.js.map +1 -0
- package/dist/parse.d.ts +3 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +28 -0
- package/dist/parse.js.map +1 -0
- package/dist/state.d.ts +4 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +2 -0
- package/dist/state.js.map +1 -0
- package/dist/statement.d.ts +71 -0
- package/dist/statement.d.ts.map +1 -0
- package/dist/statement.js +10 -0
- package/dist/statement.js.map +1 -0
- package/dist/steps.d.ts +20 -0
- package/dist/steps.d.ts.map +1 -0
- package/{src → dist}/steps.js +17 -24
- package/dist/steps.js.map +1 -0
- package/dist/tags.d.ts +5 -0
- package/dist/tags.d.ts.map +1 -0
- package/{src → dist}/tags.js +20 -33
- package/dist/tags.js.map +1 -0
- package/dist/vitest-cucumber-plugin.d.ts +13 -0
- package/dist/vitest-cucumber-plugin.d.ts.map +1 -0
- package/dist/vitest-cucumber-plugin.js +69 -0
- package/dist/vitest-cucumber-plugin.js.map +1 -0
- package/package.json +64 -34
- package/generate-parsers +0 -6
- package/rollup-gherkin.js +0 -10
- package/rollup-tags-expression.js +0 -10
- package/run-tests +0 -9
- package/src/generate/example.js +0 -21
- package/src/generate/examples.js +0 -49
- package/src/generate/feature.js +0 -72
- package/src/generate/index.js +0 -15
- package/src/generate/rule.js +0 -22
- package/src/generate/scenario-outline.js +0 -21
- package/src/generate/util.js +0 -9
- package/src/gherkin.ne +0 -217
- package/src/hooks.js +0 -78
- package/src/index.js +0 -92
- package/src/logger.js +0 -14
- package/src/parameterize.js +0 -7
- package/src/parse.js +0 -21
- package/src/tags-expression.ne +0 -43
- package/tests/background/features/background.feature +0 -25
- package/tests/background/features/step_definitions/steps.js +0 -30
- package/tests/background/features/support/hooks.js +0 -3
- package/tests/background/package-lock.json +0 -1204
- package/tests/background/package.json +0 -11
- package/tests/background/vite.config.js +0 -13
- package/tests/comments/features/is-it-friday.feature +0 -10
- package/tests/comments/features/step_definitions/stepdefs.js +0 -15
- package/tests/comments/package-lock.json +0 -1933
- package/tests/comments/package.json +0 -11
- package/tests/comments/vite.config.js +0 -9
- package/tests/data-tables/features/data-tables-escaping.feature +0 -27
- package/tests/data-tables/features/data-tables.feature +0 -44
- package/tests/data-tables/features/step_definitions/data-tables.js +0 -21
- package/tests/data-tables/package-lock.json +0 -1933
- package/tests/data-tables/package.json +0 -11
- package/tests/data-tables/vite.config.js +0 -13
- package/tests/doc-strings/features/doc-strings.feature +0 -21
- package/tests/doc-strings/features/step_definitions/doc-strings.js +0 -15
- package/tests/doc-strings/package-lock.json +0 -1933
- package/tests/doc-strings/package.json +0 -11
- package/tests/doc-strings/vite.config.js +0 -13
- package/tests/hooks/features/after-all.feature +0 -5
- package/tests/hooks/features/after.feature +0 -5
- package/tests/hooks/features/before-all.feature +0 -14
- package/tests/hooks/features/before-step.feature +0 -6
- package/tests/hooks/features/before.feature +0 -14
- package/tests/hooks/features/step_definitions/steps.js +0 -28
- package/tests/hooks/features/support/hooks.js +0 -75
- package/tests/hooks/features/support/tags-hooks.js +0 -11
- package/tests/hooks/features/tags.feature +0 -14
- package/tests/hooks/package-lock.json +0 -1204
- package/tests/hooks/package.json +0 -11
- package/tests/hooks/vite.config.js +0 -13
- package/tests/is-it-friday/features/is-it-friday.feature +0 -7
- package/tests/is-it-friday/features/step_definitions/stepdefs.js +0 -15
- package/tests/is-it-friday/package-lock.json +0 -1933
- package/tests/is-it-friday/package.json +0 -11
- package/tests/is-it-friday/vite.config.js +0 -13
- package/tests/is-it-friday-scenario-outline/features/is-it-friday.feature +0 -13
- package/tests/is-it-friday-scenario-outline/features/step_definitions/stepdefs.js +0 -15
- package/tests/is-it-friday-scenario-outline/package-lock.json +0 -1933
- package/tests/is-it-friday-scenario-outline/package.json +0 -11
- package/tests/is-it-friday-scenario-outline/vite.config.js +0 -9
- package/tests/is-it-friday-two-scenarios/features/is-it-friday.feature +0 -12
- package/tests/is-it-friday-two-scenarios/features/step_definitions/stepdefs.js +0 -19
- package/tests/is-it-friday-two-scenarios/package-lock.json +0 -1933
- package/tests/is-it-friday-two-scenarios/package.json +0 -11
- package/tests/is-it-friday-two-scenarios/vite.config.js +0 -9
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/friday.feature +0 -7
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/step_definitions/stepdefs.js +0 -19
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/sunday.feature +0 -8
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/package-lock.json +0 -1933
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/package.json +0 -11
- package/tests/is-it-friday-two-scenarios-multiple-feature-files/vite.config.js +0 -9
- package/tests/keyword-aliases/features/scenario-outline.feature +0 -20
- package/tests/keyword-aliases/features/scenario.feature +0 -14
- package/tests/keyword-aliases/features/step_definitions/steps.js +0 -30
- package/tests/keyword-aliases/features/steps.feature +0 -28
- package/tests/keyword-aliases/features/support/hooks.js +0 -6
- package/tests/keyword-aliases/package-lock.json +0 -1933
- package/tests/keyword-aliases/package.json +0 -11
- package/tests/keyword-aliases/vite.config.js +0 -9
- package/tests/rule/features/rule.feature +0 -14
- package/tests/rule/features/step_definitions/stepdefs.js +0 -19
- package/tests/rule/package-lock.json +0 -1933
- package/tests/rule/package.json +0 -11
- package/tests/rule/vite.config.js +0 -9
- package/tests/tags/features/skip.feature +0 -9
- package/tests/tags/features/step_definitions/steps.js +0 -30
- package/tests/tags/features/support/hooks.js +0 -6
- package/tests/tags/features/tags-scenario-outline.feature +0 -37
- package/tests/tags/features/tags.feature +0 -26
- package/tests/tags/package-lock.json +0 -1204
- package/tests/tags/package.json +0 -11
- package/tests/tags/vite.config.js +0 -12
- package/tests/vue/features/step_definitions/test.js +0 -25
- package/tests/vue/features/support/components.js +0 -19
- package/tests/vue/features/test.feature +0 -10
- package/tests/vue/package-lock.json +0 -2164
- package/tests/vue/package.json +0 -18
- package/tests/vue/src/test.vue +0 -10
- package/tests/vue/vite.config.js +0 -15
- /package/{src → dist}/tags-expression.js +0 -0
- /package/{src → dist}/tags-expression.umd.js +0 -0
package/src/generate/rule.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash/fp.js';
|
|
2
|
-
import { generateExample } from './index.js';
|
|
3
|
-
import { escape, shouldSkip } from './util.js';
|
|
4
|
-
import { log } from '../logger.js';
|
|
5
|
-
|
|
6
|
-
export const generateRule = (config,rule) => {
|
|
7
|
-
log.debug('generateRule config: '+JSON.stringify(config)+' rule: '+JSON.stringify(rule));
|
|
8
|
-
|
|
9
|
-
const examplesCode = _.reduce((examplesCode,example) => {
|
|
10
|
-
return examplesCode + generateExample(config,example);
|
|
11
|
-
},'')(rule.examples);
|
|
12
|
-
|
|
13
|
-
const skip = shouldSkip(config,rule.tags) ? '.skip' : '';
|
|
14
|
-
const tagsStr = JSON.stringify(rule.tags);
|
|
15
|
-
|
|
16
|
-
const code = ` // tags : ${tagsStr}
|
|
17
|
-
describe${skip}('${escape(rule.type.name)}: ${escape(rule.name)}', () => {
|
|
18
|
-
${examplesCode}});
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
return code;
|
|
22
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash/fp.js';
|
|
2
|
-
import { generateExamples } from './examples.js';
|
|
3
|
-
import { escape, shouldSkip } from './util.js';
|
|
4
|
-
|
|
5
|
-
export const generateScenarioOutline = (config,scenarioOutline) => {
|
|
6
|
-
const examplesStatements = _.reduce((examplesStatements,examplesStatement) => {
|
|
7
|
-
examplesStatement = _.set('tags',_.concat(scenarioOutline.tags,examplesStatement.tags),examplesStatement);
|
|
8
|
-
|
|
9
|
-
return examplesStatements + generateExamples(config,scenarioOutline.steps,examplesStatement);
|
|
10
|
-
},'')(scenarioOutline.examples);
|
|
11
|
-
|
|
12
|
-
const skip = shouldSkip(config,scenarioOutline.tags) ? '.skip' : '';
|
|
13
|
-
|
|
14
|
-
const code = ` // tags : ${JSON.stringify(scenarioOutline.tags)}
|
|
15
|
-
describe${skip}('${escape(scenarioOutline.type.name)}: ${escape(scenarioOutline.name)}', () => {
|
|
16
|
-
${examplesStatements}
|
|
17
|
-
});
|
|
18
|
-
`;
|
|
19
|
-
|
|
20
|
-
return code;
|
|
21
|
-
}
|
package/src/generate/util.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash/fp.js';
|
|
2
|
-
import { log } from '../logger.js';
|
|
3
|
-
|
|
4
|
-
export const escape = (str) => str.replace(/'/g,"\\'");
|
|
5
|
-
export const shouldSkip = (config,tags) => {
|
|
6
|
-
const result = !config.tagsFunction(tags);
|
|
7
|
-
log.debug('shouldSkip? '+result+' tags: '+JSON.stringify(tags));
|
|
8
|
-
return result;
|
|
9
|
-
}
|
package/src/gherkin.ne
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
@{%
|
|
2
|
-
const fp = require('lodash/fp.js');
|
|
3
|
-
const moo = require('moo');
|
|
4
|
-
const lexer = moo.compile({
|
|
5
|
-
emptyLine : { match: /^[ \t]*(?:\#[^\n]+)?\n/, lineBreaks : true },
|
|
6
|
-
newline : { match : '\n', lineBreaks : true },
|
|
7
|
-
ws : /[ \t]+/,
|
|
8
|
-
at : '@',
|
|
9
|
-
colon : ':',
|
|
10
|
-
repeatStep : '*',
|
|
11
|
-
pipe : '|',
|
|
12
|
-
escapedPipe : '\\|',
|
|
13
|
-
escapedNewline : '\\n',
|
|
14
|
-
escapedBackSlash : '\\\\',
|
|
15
|
-
scenarioOutline : ['Scenario Outline','Scenario Template'],
|
|
16
|
-
docString : ['```','"""'],
|
|
17
|
-
word : {
|
|
18
|
-
match : /[^ \t\n\:\|\@\*]+/,
|
|
19
|
-
type : moo.keywords({
|
|
20
|
-
feature : 'Feature',
|
|
21
|
-
examples : ['Examples','Scenarios'],
|
|
22
|
-
given : 'Given',
|
|
23
|
-
when : 'When',
|
|
24
|
-
then : 'Then',
|
|
25
|
-
repeatStep : ['And','But'],
|
|
26
|
-
example : ['Example','Scenario'],
|
|
27
|
-
background : 'Background',
|
|
28
|
-
rule : 'Rule',
|
|
29
|
-
}),
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const trimWhitespace = (cols,str) => {
|
|
34
|
-
const lines = str.split('\n').slice(0,-1);
|
|
35
|
-
return fp.reduce((s,line) => {
|
|
36
|
-
return s+line.slice(cols)+'\n'
|
|
37
|
-
},'')(lines);
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const setRepeatStepTypesReducer = (steps,step) => {
|
|
41
|
-
if (!fp.has('type.type',step)) {
|
|
42
|
-
step = fp.set('type.type',fp.last(steps).type.type,step);
|
|
43
|
-
}
|
|
44
|
-
return fp.concat(steps,step);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const setRepeatStepTypes = (steps) => fp.reduce(setRepeatStepTypesReducer,[],steps);
|
|
48
|
-
|
|
49
|
-
%}
|
|
50
|
-
|
|
51
|
-
@lexer lexer
|
|
52
|
-
|
|
53
|
-
main -> emptyLines tags feature {% data => fp.set('tags',data[1],data[2]) %}
|
|
54
|
-
|
|
55
|
-
feature -> featureStatement freeform background statements {%
|
|
56
|
-
(data) => fp.assign(data[0],{ description : data[1].trim(), background : data[2], statements : data[3] })
|
|
57
|
-
%}
|
|
58
|
-
featureStatement -> _ %feature _ %colon text %newline {%
|
|
59
|
-
(data) => { return { type : { type : 'feature', name : data[1].value.trim() }, name : data[4].trim() } }
|
|
60
|
-
%}
|
|
61
|
-
|
|
62
|
-
tags -> null {% data => [] %}
|
|
63
|
-
| _ tag tagList %newline {% data => fp.concat(data[1],data[2]) %}
|
|
64
|
-
|
|
65
|
-
tagList -> null {% data => [] %}
|
|
66
|
-
| tagList %ws tag {% data => fp.concat(data[0],data[2]) %}
|
|
67
|
-
|
|
68
|
-
tag -> %at %word {% data => data[1].value.trim() %}
|
|
69
|
-
|
|
70
|
-
background -> null {% data => null %}
|
|
71
|
-
| backgroundStatement freeform steps {%
|
|
72
|
-
data => fp.assign(data[0],{ description : data[1].trim(), steps : data[2] })
|
|
73
|
-
%}
|
|
74
|
-
|
|
75
|
-
backgroundStatement -> _ %background _ %colon text %newline {%
|
|
76
|
-
(data) => { return { type : { type : 'background', name : data[1].value }, name : data[4].trim() } }
|
|
77
|
-
%}
|
|
78
|
-
|
|
79
|
-
statement -> example {% data => data[0] %}
|
|
80
|
-
| scenarioOutline {% data => data[0] %}
|
|
81
|
-
| rule {% data => data[0] %}
|
|
82
|
-
|
|
83
|
-
statements -> null {% data => [] %}
|
|
84
|
-
| statements statement {% data => fp.concat(data[0],data[1]) %}
|
|
85
|
-
|
|
86
|
-
example -> tags exampleStatement steps {% (data) => fp.assign(data[1],{ tags : data[0], steps : data[2] }) %}
|
|
87
|
-
exampleStatement -> _ exampleKeyword _ %colon text %newline {%
|
|
88
|
-
(data) => { return { type : { type : 'example', name : data[1] }, name : data[4].trim() } }
|
|
89
|
-
%}
|
|
90
|
-
exampleKeyword -> %example {% data => data[0].value %}
|
|
91
|
-
|
|
92
|
-
exampleList -> null {% data => [] %}
|
|
93
|
-
| exampleList example {% data => fp.concat(data[0],data[1]) %}
|
|
94
|
-
|
|
95
|
-
scenarioOutline -> tags scenarioOutlineStatement steps examplesList {%
|
|
96
|
-
data => fp.assign(data[1],{ tags : data[0], steps : data[2], examples : data[3] })
|
|
97
|
-
%}
|
|
98
|
-
scenarioOutlineStatement -> _ scenarioOutlineKeyword _ %colon text %newline {%
|
|
99
|
-
(data) => { return { type : { type : 'scenarioOutline', name : data[1] }, name : data[4].trim() } }
|
|
100
|
-
%}
|
|
101
|
-
scenarioOutlineKeyword -> %scenarioOutline {% data => data[0].value %}
|
|
102
|
-
|
|
103
|
-
rule -> tags ruleStatement example exampleList {%
|
|
104
|
-
data => fp.assign(data[1],{ tags : data[0], examples : fp.concat(data[2],data[3]) })
|
|
105
|
-
%}
|
|
106
|
-
ruleStatement -> _ ruleKeyword _ %colon text %newline {%
|
|
107
|
-
(data) => { return { type : { type : 'rule', name : data[1] }, name : data[4].trim() } }
|
|
108
|
-
%}
|
|
109
|
-
ruleKeyword -> %rule {% data => data[0].value %}
|
|
110
|
-
|
|
111
|
-
examplesList -> null {% data => [] %}
|
|
112
|
-
| examplesList examples {% data => fp.concat(data[0],data[1]) %}
|
|
113
|
-
|
|
114
|
-
examples -> tags examplesStatement dataTable emptyLines {%
|
|
115
|
-
data => fp.assign(data[1],{ tags : data[0], dataTable : data[2] })
|
|
116
|
-
%}
|
|
117
|
-
examplesStatement -> _ examplesKeyword _ %colon text %newline {%
|
|
118
|
-
(data) => { return { type : { type : 'examples', name : data[1] }, name : data[4] } }
|
|
119
|
-
%}
|
|
120
|
-
examplesKeyword -> %examples {% data => data[0].value %}
|
|
121
|
-
|
|
122
|
-
dataTable -> dataTableRow {% data => [data[0]] %}
|
|
123
|
-
| dataTable dataTableRow {% data => fp.concat(data[0],[data[1]]) %}
|
|
124
|
-
|
|
125
|
-
dataTableRow -> _ %pipe dataTableColumns %newline {% data => data[2] %}
|
|
126
|
-
|
|
127
|
-
dataTableColumns -> null {% data => [] %}
|
|
128
|
-
| dataTableColumns dataTableColumnText %pipe {% data => fp.concat(data[0],data[1].trim()) %}
|
|
129
|
-
|
|
130
|
-
dataTableColumnText -> null {% data => '' %}
|
|
131
|
-
| dataTableColumnText escapedColumnCharaters {% data => data[0]+data[1] %}
|
|
132
|
-
| dataTableColumnText keywords {% data => data[0]+data[1] %}
|
|
133
|
-
| dataTableColumnText %word {% data => data[0]+data[1].value %}
|
|
134
|
-
| dataTableColumnText %ws {% data => data[0]+data[1].value %}
|
|
135
|
-
| dataTableColumnText %at {% data => data[0]+data[1].value %}
|
|
136
|
-
|
|
137
|
-
escapedColumnCharaters -> %escapedPipe {% data => '|' %}
|
|
138
|
-
| %escapedBackSlash {% data => '\\' %}
|
|
139
|
-
| %escapedNewline {% data => '\n' %}
|
|
140
|
-
|
|
141
|
-
steps -> step moreSteps {% data => setRepeatStepTypes(fp.concat(data[0],data[1])) %}
|
|
142
|
-
|
|
143
|
-
moreSteps -> null {% data => [] %}
|
|
144
|
-
| moreSteps step {% data => fp.concat(data[0],data[1]) %}
|
|
145
|
-
| moreSteps repeatStep {% data => fp.concat(data[0],data[1]) %}
|
|
146
|
-
| moreSteps %emptyLine {% data => data[0] %}
|
|
147
|
-
|
|
148
|
-
step -> stepStatement
|
|
149
|
-
| stepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
|
|
150
|
-
| stepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
|
|
151
|
-
|
|
152
|
-
stepStatement -> _ stepKeyword text %newline {% data => { return { type : data[1], text : data[2].trim() } } %}
|
|
153
|
-
|
|
154
|
-
stepKeyword -> %given {% (data) => { return { type : 'given', name : data[0].value } } %}
|
|
155
|
-
| %when {% (data) => { return { type : 'when', name : data[0].value } } %}
|
|
156
|
-
| %then {% (data) => { return { type : 'then', name : data[0].value } } %}
|
|
157
|
-
|
|
158
|
-
repeatStep -> repeatStepStatement
|
|
159
|
-
| repeatStepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
|
|
160
|
-
| repeatStepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
|
|
161
|
-
|
|
162
|
-
repeatStepStatement -> _ repeatStepKeyword text %newline {%
|
|
163
|
-
data => { return { type : data[1], text : data[2].trim() } }
|
|
164
|
-
%}
|
|
165
|
-
|
|
166
|
-
repeatStepKeyword -> %repeatStep {% (data) => { return { name : data[0].value } } %}
|
|
167
|
-
|
|
168
|
-
text -> null {% data => '' %}
|
|
169
|
-
| text %word {% data => data[0]+data[1].value %}
|
|
170
|
-
| text %ws {% data => data[0]+data[1].value %}
|
|
171
|
-
| text keywords {% data => data[0]+data[1] %}
|
|
172
|
-
| text %at {% data => data[0]+data[1].value %}
|
|
173
|
-
| text %pipe {% data => data[0]+data[1].value %}
|
|
174
|
-
| text %escapedPipe {% data => data[0]+data[1].value %}
|
|
175
|
-
| text %escapedNewline {% data => data[0]+data[1].value %}
|
|
176
|
-
| text %escapedBackSlash {% data => data[0]+data[1].value %}
|
|
177
|
-
|
|
178
|
-
keywords -> %given {% data => data[0].value %}
|
|
179
|
-
| %when {% data => data[0].value %}
|
|
180
|
-
| %then {% data => data[0].value %}
|
|
181
|
-
| %repeatStep {% data => data[0].value %}
|
|
182
|
-
| %colon {% data => data[0].value %}
|
|
183
|
-
| %example {% data => data[0].value %}
|
|
184
|
-
| %examples {% data => data[0].value %}
|
|
185
|
-
| %scenarioOutline {% data => data[0].value %}
|
|
186
|
-
| %background {% data => data[0].value %}
|
|
187
|
-
|
|
188
|
-
bolText -> %ws %word {% data => data[1].value %}
|
|
189
|
-
| %word {% data => data[0].value %}
|
|
190
|
-
|
|
191
|
-
freeform -> null {% data => '' %}
|
|
192
|
-
| freeform bolText text %newline {% (data) => {
|
|
193
|
-
return data[0]+data[1]+data[2]+'\n'
|
|
194
|
-
}
|
|
195
|
-
%}
|
|
196
|
-
| freeform %emptyLine {% data => data[0]+'\n' %}
|
|
197
|
-
|
|
198
|
-
docString -> docStringStatement docText docStringStatement {%
|
|
199
|
-
data => fp.set('text',trimWhitespace(data[0].ws.length,data[1]),data[0])
|
|
200
|
-
%}
|
|
201
|
-
docStringStatement -> _ %docString contentType %newline {%
|
|
202
|
-
(data) => { return { type : { type : 'docString', name : data[1].value }, ws : data[0], contentType : data[2] } }
|
|
203
|
-
%}
|
|
204
|
-
|
|
205
|
-
contentType -> null {% data => null %}
|
|
206
|
-
| %ws {% data => null %}
|
|
207
|
-
| %word {% data => data[0].value %}
|
|
208
|
-
|
|
209
|
-
docText -> null {% data => '' %}
|
|
210
|
-
| docText text %newline {% data => data[0]+data[1]+data[2].value %}
|
|
211
|
-
| docText %emptyLine {% data => data[0]+data[1].value %}
|
|
212
|
-
|
|
213
|
-
_ -> null {% data => '' %}
|
|
214
|
-
| %ws {% data => data[0].value %}
|
|
215
|
-
|
|
216
|
-
emptyLines -> null {% data => '' %}
|
|
217
|
-
| emptyLines %emptyLine {% data => data[0]+'\n' %}
|
package/src/hooks.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { log } from './logger.js';
|
|
2
|
-
import _ from 'lodash/fp.js';
|
|
3
|
-
import { tagsFunction } from './tags.js';
|
|
4
|
-
|
|
5
|
-
const allHooks = {
|
|
6
|
-
beforeAll : [],
|
|
7
|
-
before : [],
|
|
8
|
-
beforeStep : [],
|
|
9
|
-
afterAll : [],
|
|
10
|
-
after : [],
|
|
11
|
-
afterStep : [],
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const hookNames = {
|
|
15
|
-
beforeAll : 'BeforeAll',
|
|
16
|
-
before : 'Before',
|
|
17
|
-
beforeStep : 'BeforeStep',
|
|
18
|
-
afterAll : 'AfterAll',
|
|
19
|
-
after : 'After',
|
|
20
|
-
afterStep : 'AfterStep',
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const applyHooks = async (hooksName,state,tags) => {
|
|
25
|
-
const hooks = allHooks[hooksName];
|
|
26
|
-
log.debug('applyHooks: '+hooksName+' state: '+JSON.stringify(state));
|
|
27
|
-
for (let i = 0; i < hooks.length; i++) {
|
|
28
|
-
let hook = hooks[i];
|
|
29
|
-
|
|
30
|
-
log.debug('applyHooks name: '+hook.name+' state: '+JSON.stringify(state));
|
|
31
|
-
|
|
32
|
-
const result = hook.tagsFunction(tags);
|
|
33
|
-
|
|
34
|
-
log.debug('applyHooks match? '+result+' tags: '+JSON.stringify(tags));
|
|
35
|
-
if (result) {
|
|
36
|
-
const origState = state;
|
|
37
|
-
state = await hook.f(state);
|
|
38
|
-
log.info(hookNames[hooksName]+'(\''+hook.name+'\') ('+JSON.stringify(origState)+') => '+
|
|
39
|
-
JSON.stringify(state));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return state;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const addHook = (hooksName,opts,f) => {
|
|
46
|
-
if (_.isFunction(opts)) {
|
|
47
|
-
opts = { name : '', f : opts };
|
|
48
|
-
} else if (_.isString(opts)) {
|
|
49
|
-
opts = { name : opts, f };
|
|
50
|
-
} else if (_.isObject(opts)) {
|
|
51
|
-
opts.f = f;
|
|
52
|
-
} else {
|
|
53
|
-
throw new Error('Unknown options argument: '+JSON.stringify(opts));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
opts = _.set('tagsFunction',tagsFunction(opts.tags),opts);
|
|
57
|
-
|
|
58
|
-
log.debug('addHook hooksName: '+hooksName+' name: '+opts.name);
|
|
59
|
-
allHooks[hooksName] = _.concat(allHooks[hooksName],opts);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const BeforeAll = (opts,f) => { addHook('beforeAll',opts,f) };
|
|
63
|
-
export const applyBeforeAllHooks = (state,tags) => applyHooks('beforeAll',state,tags);
|
|
64
|
-
|
|
65
|
-
export const Before = (opts,f) => { addHook('before',opts,f) };
|
|
66
|
-
export const applyBeforeHooks = (state,tags) => applyHooks('before',state,tags);
|
|
67
|
-
|
|
68
|
-
export const BeforeStep = (opts,f) => { addHook('beforeStep',opts,f) };
|
|
69
|
-
export const applyBeforeStepHooks = (state,tags) => applyHooks('beforeStep',state,tags);
|
|
70
|
-
|
|
71
|
-
export const AfterAll = (opts,f) => { addHook('afterAll',opts,f) };
|
|
72
|
-
export const applyAfterAllHooks = (state,tags) => applyHooks('afterAll',state,tags);
|
|
73
|
-
|
|
74
|
-
export const After = (opts,f) => { addHook('after',opts,f) };
|
|
75
|
-
export const applyAfterHooks = (state,tags) => applyHooks('after',state,tags);
|
|
76
|
-
|
|
77
|
-
export const AfterStep = (opts,f) => { addHook('afterStep',opts,f) };
|
|
78
|
-
export const applyAfterStepHooks = (state,tags) => applyHooks('afterStep',state,tags);
|
package/src/index.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash/fp.js';
|
|
2
|
-
import { addStepDefinition, findStepDefinitionMatch } from './steps.js';
|
|
3
|
-
import { parameterizeText } from './parameterize.js';
|
|
4
|
-
import { generateFeature } from './generate/index.js';
|
|
5
|
-
import { log, logConfig } from './logger.js';
|
|
6
|
-
import { parse } from './parse.js';
|
|
7
|
-
import { tagsFunction } from './tags.js';
|
|
8
|
-
import {
|
|
9
|
-
BeforeAll, applyBeforeAllHooks,
|
|
10
|
-
Before, applyBeforeHooks,
|
|
11
|
-
AfterAll, applyAfterAllHooks,
|
|
12
|
-
After, applyAfterHooks,
|
|
13
|
-
BeforeStep, applyBeforeStepHooks,
|
|
14
|
-
AfterStep, applyAfterStepHooks,
|
|
15
|
-
} from './hooks.js';
|
|
16
|
-
|
|
17
|
-
const featureRegex = /\.feature$/;
|
|
18
|
-
|
|
19
|
-
const compileFeatureToJS = async (config,featureSrc) => {
|
|
20
|
-
const feature = parse(featureSrc);
|
|
21
|
-
|
|
22
|
-
const code = await generateFeature(config,feature);
|
|
23
|
-
|
|
24
|
-
return code;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export { BeforeAll, Before, AfterAll, After, BeforeStep, AfterStep };
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
applyBeforeAllHooks,
|
|
31
|
-
applyBeforeHooks,
|
|
32
|
-
applyAfterAllHooks,
|
|
33
|
-
applyAfterHooks,
|
|
34
|
-
applyBeforeStepHooks,
|
|
35
|
-
applyAfterStepHooks,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export { log, logConfig };
|
|
39
|
-
|
|
40
|
-
export const Given = addStepDefinition;
|
|
41
|
-
export const When = addStepDefinition;
|
|
42
|
-
export const Then = addStepDefinition;
|
|
43
|
-
|
|
44
|
-
export const Test = (state,step) => {
|
|
45
|
-
log.debug('Test step: '+JSON.stringify(step)+' state:'+JSON.stringify(state));
|
|
46
|
-
const stepDefinitionMatch = findStepDefinitionMatch(step);
|
|
47
|
-
|
|
48
|
-
const extraData = step.dataTable ? step.dataTable : (step.docString ? step.docString.text : null );
|
|
49
|
-
|
|
50
|
-
const newState = stepDefinitionMatch.stepDefinition.f(state,stepDefinitionMatch.parameters,extraData);
|
|
51
|
-
log.info(step.type.name+'(\''+stepDefinitionMatch.stepDefinition.expression+'\') ('+
|
|
52
|
-
JSON.stringify(state)+','+JSON.stringify(stepDefinitionMatch.parameters)+','+JSON.stringify(extraData)+
|
|
53
|
-
') => '+JSON.stringify(newState));
|
|
54
|
-
log.debug('Test newState: '+JSON.stringify(newState));
|
|
55
|
-
|
|
56
|
-
return newState;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export const DataTable = (dataTable) => {
|
|
60
|
-
const parameters = _.first(dataTable);
|
|
61
|
-
const rows = _.tail(dataTable);
|
|
62
|
-
|
|
63
|
-
return _.map((row) => _.zipObject(parameters,row))(rows);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export default function vitestCucumberPlugin() {
|
|
67
|
-
let config;
|
|
68
|
-
|
|
69
|
-
return {
|
|
70
|
-
name : 'vitest-cucumber-transform',
|
|
71
|
-
configResolved : (resolvedConfig) => {
|
|
72
|
-
config = _.defaults({ root : resolvedConfig.root, log : { level : 'warn' } },
|
|
73
|
-
_.get('test.cucumber',resolvedConfig))
|
|
74
|
-
logConfig(config.log);
|
|
75
|
-
|
|
76
|
-
config = _.set('tagsFunction',tagsFunction(_.get('tags',config)),config);
|
|
77
|
-
|
|
78
|
-
log.debug('config: '+JSON.stringify(config));
|
|
79
|
-
},
|
|
80
|
-
transform : async (src,id) => {
|
|
81
|
-
if (featureRegex.test(id)) {
|
|
82
|
-
const code = await compileFeatureToJS(config,src);
|
|
83
|
-
|
|
84
|
-
log.debug('transform '+id+' -> '+code);
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
code
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
package/src/logger.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash/fp.js';
|
|
2
|
-
import pino from 'pino';
|
|
3
|
-
|
|
4
|
-
export var log = pino();
|
|
5
|
-
|
|
6
|
-
log.level = 'warn';
|
|
7
|
-
|
|
8
|
-
export const logConfig = (config) => {
|
|
9
|
-
if (_.has('file',config)) {
|
|
10
|
-
log = pino(config,config.file);
|
|
11
|
-
} else {
|
|
12
|
-
log = pino(config);
|
|
13
|
-
}
|
|
14
|
-
};
|
package/src/parameterize.js
DELETED
package/src/parse.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import nearley from 'nearley';
|
|
2
|
-
import gherkin from './gherkin.js';
|
|
3
|
-
import { log } from './logger.js';
|
|
4
|
-
|
|
5
|
-
export const parse = (src) => {
|
|
6
|
-
const parser = new nearley.Parser(nearley.Grammar.fromCompiled(gherkin));
|
|
7
|
-
|
|
8
|
-
log.debug('parsing src: '+src);
|
|
9
|
-
parser.feed(src);
|
|
10
|
-
|
|
11
|
-
if (parser.results.length == 0) {
|
|
12
|
-
throw new Error('Unexpected end of file');
|
|
13
|
-
}
|
|
14
|
-
log.debug('parsing result: '+JSON.stringify(parser.results));
|
|
15
|
-
if (parser.results.length > 1) {
|
|
16
|
-
throw new Error('Ambiguous parsing: '+parser.results.length);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const results = parser.results;
|
|
20
|
-
return results[0];
|
|
21
|
-
}
|
package/src/tags-expression.ne
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
@{%
|
|
2
|
-
const fp = require('lodash/fp.js');
|
|
3
|
-
const moo = require('moo');
|
|
4
|
-
const lexer = moo.compile({
|
|
5
|
-
and : 'and',
|
|
6
|
-
or : 'or',
|
|
7
|
-
not : 'not',
|
|
8
|
-
openParen : '(',
|
|
9
|
-
closeParen : ')',
|
|
10
|
-
newline : { match : '\n', lineBreaks : true },
|
|
11
|
-
ws : /[ \t]+/,
|
|
12
|
-
tag : /\@[\w\.]+/,
|
|
13
|
-
});
|
|
14
|
-
%}
|
|
15
|
-
|
|
16
|
-
@lexer lexer
|
|
17
|
-
|
|
18
|
-
main -> expression %newline {% data => data[0] %}
|
|
19
|
-
|
|
20
|
-
expression -> tag {% data => data[0] %}
|
|
21
|
-
| unaryOperation {% data => data[0] %}
|
|
22
|
-
| binaryOperation {% data => data[0] %}
|
|
23
|
-
| parenOperation {% data => data[0] %}
|
|
24
|
-
|
|
25
|
-
parenOperation -> %openParen _ expression _ %closeParen {% data => data[2] %}
|
|
26
|
-
|
|
27
|
-
unaryOperation -> %not %ws unaryExpression {% data => { return { operator : 'not', expression : data[2] } } %}
|
|
28
|
-
|
|
29
|
-
unaryExpression -> tag {% id %}
|
|
30
|
-
| parenOperation {% id %}
|
|
31
|
-
|
|
32
|
-
binaryOperation -> expression _ binaryOperator _ expression {%
|
|
33
|
-
data => { return { operator : data[2], left : data[0], right : data[4] } }
|
|
34
|
-
%}
|
|
35
|
-
|
|
36
|
-
binaryOperator -> %and {% data => data[0].value %}
|
|
37
|
-
| %or {% data => data[0].value %}
|
|
38
|
-
|
|
39
|
-
tag -> %tag {% data => data[0].value.slice(1) %}
|
|
40
|
-
|
|
41
|
-
_ -> null
|
|
42
|
-
| %ws
|
|
43
|
-
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
Feature: The Background keyword behaviors
|
|
2
|
-
The Background keyword allow you to add context to scenarios that follow it.
|
|
3
|
-
|
|
4
|
-
# This is the background.
|
|
5
|
-
Background: Set up some background data
|
|
6
|
-
It's the cool thing to do.
|
|
7
|
-
|
|
8
|
-
Given I have a "orange"
|
|
9
|
-
And I have a "grape"
|
|
10
|
-
|
|
11
|
-
Scenario: What's the scenario?
|
|
12
|
-
Given I have a "apple"
|
|
13
|
-
When I get a "pea"
|
|
14
|
-
Then I have the following items:
|
|
15
|
-
| orange |
|
|
16
|
-
| grape |
|
|
17
|
-
| apple |
|
|
18
|
-
| pea |
|
|
19
|
-
|
|
20
|
-
Scenario: It's another scenario!
|
|
21
|
-
When I get a "pea"
|
|
22
|
-
Then I have the following items:
|
|
23
|
-
| orange |
|
|
24
|
-
| grape |
|
|
25
|
-
| pea |
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Given, When, Then, DataTable } from 'vitest-cucumber-plugin';
|
|
2
|
-
import { expect } from 'vitest'
|
|
3
|
-
import _ from 'lodash/fp';
|
|
4
|
-
|
|
5
|
-
const addItem = (state,[ item ],data) => { return { items : _.concat(state.items ? state.items : [],item) } };
|
|
6
|
-
|
|
7
|
-
Given('I have a {string}',addItem);
|
|
8
|
-
Then('I get a {string}',addItem);
|
|
9
|
-
Then('I have the following items:',(state,params,data) => {
|
|
10
|
-
const items = _.flatten(data);
|
|
11
|
-
expect(state.items).toEqual(items);
|
|
12
|
-
return state;
|
|
13
|
-
});
|
|
14
|
-
Then('I don\'t have a {string}',(state,[ item ],data) => {
|
|
15
|
-
expect(state.items).not.toContain(item);
|
|
16
|
-
return state;
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
Given('there are {int} cucumbers',(state,[ count ],data) => {
|
|
20
|
-
return _.set('cucumbers',count,state);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
When('I eat {int} cucumbers',(state,[ count ],data) => {
|
|
24
|
-
return _.set('cucumbers',state.cucumbers - count,state);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
Then('I should have {int} cucumbers',(state,[ count ],data) => {
|
|
28
|
-
expect(state.cucumbers).toEqual(count);
|
|
29
|
-
return state;
|
|
30
|
-
});
|