Skip to content

Commit 44479c8

Browse files
author
kochau
committed
GFENG-112153: additional validation rules for Gherkin Parser are added.
The following validations are covered: - Missing 'Feature' keyword. - Missing 'Scenario' or 'Scenario Outline' keywords. - Missing any steps for scenario. - Presence 'Examples' keyword for 'Scenario' block. - Missing 'Examples' block for 'Scenario Outline' block. - Presence of tags with spaces for 'Feature' and 'Scenario' blocks. - Presence of 'AND' step strict after 'Scenario' line. - Presence more than one 'Feature' block declaration. - Presence tags between steps keywords. - Presence steps between 'Feature' and 'Scenario' blocks.
1 parent 8f7f54c commit 44479c8

File tree

3 files changed

+52
-20
lines changed

3 files changed

+52
-20
lines changed

src/main/antlr4/com/pdsl/gherkin/parser/GherkinLexer.g4

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ fragment CAPTURE_DATA : '<' ~[>\t\r\n ]'>' ;
111111
fragment DOCSTRING_DOUBLE_QUOTES : WS* '"""' (CAPTURE_DATA | ~'"' | '"' ~'"')*? '"""' LINE_END ;
112112
fragment DOCSTRING_BACKTICKS : WS* '```' (~'`' | CAPTURE_DATA | '`' ~'`').*? '```' LINE_END;
113113
fragment TAG : '@'~[ \r\n\t@]+ ;
114+
fragment TAG_WITH_SPACES: '@' (~[\r\n@ ]* ' ' ~[\r\n@ ]+);
114115
fragment ESCAPE_SEQUENCE : '\\' [\\|\n]* ;
115116
fragment CELL_CHARACTER
116117
: CAPTURE_DATA
@@ -120,6 +121,7 @@ fragment CELL_CHARACTER
120121
fragment CELL_DATA : WS* CELL_CHARACTER* '|';
121122

122123
DOCSTRING : DOCSTRING_DOUBLE_QUOTES | DOCSTRING_BACKTICKS ;
124+
TAGS_WITH_SPACES : WS* TAG_WITH_SPACES (WS* TAG_WITH_SPACES)* (COMMENT? | LINE_END);
123125
TAGS : WS* TAG (WS* TAG)* (COMMENT? | LINE_END);
124126
FEATURE_TITLE : WS* FEATURE_KEYWORD ~[\r\n]* LINE_END ;
125127
BACKGROUND_TITLE : WS* BACKGROUND_KEYWORD ~[\r\n]* COMMENT? LINE_END ;

src/main/antlr4/com/pdsl/gherkin/parser/GherkinLexer.tokens

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,27 @@ WILD_KEYWORD=13
1414
AND_KEYWORD=14
1515
BUT_KEYWORD=15
1616
DOCSTRING=16
17-
TAGS=17
18-
FEATURE_TITLE=18
19-
BACKGROUND_TITLE=19
20-
EXAMPLES_TITLE=20
21-
SCENARIO_TITLE=21
22-
SCENARIO_OUTLINE_TITLE=22
23-
RULE_TITLE=23
24-
GIVEN_STEP=24
25-
WHEN_STEP=25
26-
THEN_STEP=26
27-
AND_STEP=27
28-
BUT_STEP=28
29-
WILD_STEP=29
30-
DATA_ROW=30
31-
INVALID_LANGUAGE_HEADER=31
32-
COMMENT=32
33-
LINE_END=33
34-
NEWLINE=34
35-
WS=35
36-
LONG_DESCRIPTION=36
17+
TAGS_WITH_SPACES=17
18+
TAGS=18
19+
FEATURE_TITLE=19
20+
BACKGROUND_TITLE=20
21+
EXAMPLES_TITLE=21
22+
SCENARIO_TITLE=22
23+
SCENARIO_OUTLINE_TITLE=23
24+
RULE_TITLE=24
25+
GIVEN_STEP=25
26+
WHEN_STEP=26
27+
THEN_STEP=27
28+
AND_STEP=28
29+
BUT_STEP=29
30+
WILD_STEP=30
31+
DATA_ROW=31
32+
INVALID_LANGUAGE_HEADER=32
33+
COMMENT=33
34+
LINE_END=34
35+
NEWLINE=35
36+
WS=36
37+
LONG_DESCRIPTION=37
3738
'Scenario Outline:'=4
3839
'Background:'=5
3940
'Rule:'=7

src/main/antlr4/com/pdsl/gherkin/parser/GherkinParser.g4

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,35 @@ ruleBlock : RULE_TITLE LONG_DESCRIPTION* background? scenario*;
1111
background : BACKGROUND_TITLE LONG_DESCRIPTION*? stepBody? ;
1212
scenario : TAGS*? (SCENARIO_TITLE | SCENARIO_OUTLINE_TITLE) LONG_DESCRIPTION* stepBody? examplesBody*;
1313
stepBody : startingStep (anyStep)* ;
14+
1415
examplesBody : TAGS*? EXAMPLES_TITLE LONG_DESCRIPTION*? DATA_ROW* ;
1516
startingStep : (GIVEN_STEP | WHEN_STEP | THEN_STEP | WILD_STEP) (DATA_ROW* | DOCSTRING) ;
1617
anyStep : (GIVEN_STEP | WHEN_STEP | THEN_STEP | AND_STEP | BUT_STEP | WILD_STEP) (DATA_ROW* | DOCSTRING) ;
18+
19+
fullFeatureBlock: LANGUAGE_HEADER? COMMENT* TAGS*? FEATURE_TITLE LONG_DESCRIPTION*?;
20+
21+
validationMissingFeature : LANGUAGE_HEADER? COMMENT* TAGS*? LONG_DESCRIPTION*?;
22+
validationMissingScenario : fullFeatureBlock TAGS*? LONG_DESCRIPTION* stepBody? examplesBody*;
23+
vadalitionScenarioWithoutSteps: fullFeatureBlock TAGS*? (SCENARIO_TITLE | SCENARIO_OUTLINE_TITLE);
24+
validationPresenceExamplesForScenario: fullFeatureBlock TAGS*? SCENARIO_TITLE LONG_DESCRIPTION* stepBody? TAGS*? EXAMPLES_TITLE LONG_DESCRIPTION*?;
25+
validationMissingExamplesRowsForScenarioOutline: fullFeatureBlock TAGS*? SCENARIO_OUTLINE_TITLE LONG_DESCRIPTION* stepBody? TAGS*? EXAMPLES_TITLE;
26+
validationFeatureTagsWithSpaces: LANGUAGE_HEADER? COMMENT* TAGS_WITH_SPACES FEATURE_TITLE LONG_DESCRIPTION*?;
27+
validationScenarioTagsWithSpaces: fullFeatureBlock TAGS_WITH_SPACES SCENARIO_TITLE LONG_DESCRIPTION* stepBody?;
28+
validationAndAfterScenario: fullFeatureBlock TAGS*? (SCENARIO_TITLE | SCENARIO_OUTLINE_TITLE) LONG_DESCRIPTION* AND_STEP stepBody?;
29+
validationSeveralFeatureDeclaration: fullFeatureBlock fullFeatureBlock;
30+
validationTagsBetweenSteps: fullFeatureBlock TAGS*? (SCENARIO_TITLE | SCENARIO_OUTLINE_TITLE) startingStep TAGS+ (anyStep)*;
31+
validationStepsBetweenFeatureAndScenario: fullFeatureBlock stepBody TAGS*? (SCENARIO_TITLE | SCENARIO_OUTLINE_TITLE);
32+
33+
validation : (
34+
validationStepsBetweenFeatureAndScenario
35+
| validationTagsBetweenSteps
36+
| vadalitionScenarioWithoutSteps
37+
| validationSeveralFeatureDeclaration
38+
| validationScenarioTagsWithSpaces
39+
| validationFeatureTagsWithSpaces
40+
| validationPresenceExamplesForScenario
41+
| validationMissingExamplesRowsForScenarioOutline
42+
| validationAndAfterScenario
43+
| validationMissingScenario
44+
| validationMissingFeature
45+
);

0 commit comments

Comments
 (0)