gherkin 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/.rsync +5 -0
  3. data/.travis.yml +16 -1
  4. data/Makefile +31 -36
  5. data/berp/CommandLine.dll +0 -0
  6. data/berp/RazorEngine.dll +0 -0
  7. data/berp/RazorEngine.pdb +0 -0
  8. data/berp/System.Web.Razor.dll +0 -0
  9. data/berp/berp.exe +0 -0
  10. data/berp/berp.pdb +0 -0
  11. data/bin/gherkin +34 -0
  12. data/bin/gherkin-generate-tokens +1 -1
  13. data/gherkin-languages.json +3191 -0
  14. data/gherkin.berp +46 -0
  15. data/gherkin.gemspec +6 -6
  16. data/lib/gherkin/gherkin-languages.json +225 -3
  17. data/lib/gherkin/pickles/compiler.rb +31 -31
  18. data/lib/gherkin/stream/gherkin_events.rb +69 -0
  19. data/lib/gherkin/stream/source_events.rb +26 -0
  20. data/lib/gherkin/token_scanner.rb +1 -1
  21. data/testdata/bad/inconsistent_cell_count.feature +14 -0
  22. data/testdata/bad/inconsistent_cell_count.feature.errors.ndjson +2 -0
  23. data/testdata/bad/invalid_language.feature +6 -0
  24. data/testdata/bad/invalid_language.feature.errors.ndjson +1 -0
  25. data/testdata/bad/multiple_parser_errors.feature +9 -0
  26. data/testdata/bad/multiple_parser_errors.feature.errors.ndjson +2 -0
  27. data/testdata/bad/not_gherkin.feature +2 -0
  28. data/testdata/bad/not_gherkin.feature.errors.ndjson +1 -0
  29. data/testdata/bad/single_parser_error.feature +7 -0
  30. data/testdata/bad/single_parser_error.feature.errors.ndjson +1 -0
  31. data/testdata/bad/unexpected_eof.feature +6 -0
  32. data/testdata/bad/unexpected_eof.feature.errors.ndjson +1 -0
  33. data/testdata/good/background.feature +8 -0
  34. data/testdata/good/background.feature.ast.ndjson +1 -0
  35. data/testdata/good/background.feature.pickles.ndjson +1 -0
  36. data/testdata/good/background.feature.source.ndjson +1 -0
  37. data/testdata/good/background.feature.tokens +9 -0
  38. data/testdata/good/datatables.feature +18 -0
  39. data/testdata/good/datatables.feature.ast.ndjson +1 -0
  40. data/testdata/good/datatables.feature.pickles.ndjson +1 -0
  41. data/testdata/good/datatables.feature.source.ndjson +1 -0
  42. data/testdata/good/datatables.feature.tokens +19 -0
  43. data/testdata/good/descriptions.feature +52 -0
  44. data/testdata/good/descriptions.feature.ast.ndjson +1 -0
  45. data/testdata/good/descriptions.feature.pickles.ndjson +8 -0
  46. data/testdata/good/descriptions.feature.source.ndjson +1 -0
  47. data/testdata/good/descriptions.feature.tokens +53 -0
  48. data/testdata/good/docstrings.feature +43 -0
  49. data/testdata/good/docstrings.feature.ast.ndjson +1 -0
  50. data/testdata/good/docstrings.feature.pickles.ndjson +1 -0
  51. data/testdata/good/docstrings.feature.source.ndjson +1 -0
  52. data/testdata/good/docstrings.feature.tokens +44 -0
  53. data/testdata/good/empty.feature +0 -0
  54. data/testdata/good/empty.feature.ast.ndjson +1 -0
  55. data/testdata/good/empty.feature.pickles.ndjson +0 -0
  56. data/testdata/good/empty.feature.source.ndjson +1 -0
  57. data/testdata/good/empty.feature.tokens +1 -0
  58. data/testdata/good/escaped_pipes.feature +11 -0
  59. data/testdata/good/escaped_pipes.feature.ast.ndjson +1 -0
  60. data/testdata/good/escaped_pipes.feature.pickles.ndjson +1 -0
  61. data/testdata/good/escaped_pipes.feature.source.ndjson +1 -0
  62. data/testdata/good/escaped_pipes.feature.tokens +14 -0
  63. data/testdata/good/example_token_multiple.feature +8 -0
  64. data/testdata/good/example_token_multiple.feature.ast.ndjson +1 -0
  65. data/testdata/good/example_token_multiple.feature.pickles.ndjson +1 -0
  66. data/testdata/good/example_token_multiple.feature.source.ndjson +1 -0
  67. data/testdata/good/example_token_multiple.feature.tokens +9 -0
  68. data/testdata/good/example_tokens_everywhere.feature +14 -0
  69. data/testdata/good/example_tokens_everywhere.feature.ast.ndjson +1 -0
  70. data/testdata/good/example_tokens_everywhere.feature.pickles.ndjson +2 -0
  71. data/testdata/good/example_tokens_everywhere.feature.source.ndjson +1 -0
  72. data/testdata/good/example_tokens_everywhere.feature.tokens +15 -0
  73. data/testdata/good/i18n_emoji.feature +5 -0
  74. data/testdata/good/i18n_emoji.feature.ast.ndjson +1 -0
  75. data/testdata/good/i18n_emoji.feature.pickles.ndjson +1 -0
  76. data/testdata/good/i18n_emoji.feature.source.ndjson +1 -0
  77. data/testdata/good/i18n_emoji.feature.tokens +6 -0
  78. data/testdata/good/i18n_fr.feature +63 -0
  79. data/testdata/good/i18n_fr.feature.ast.ndjson +1 -0
  80. data/testdata/good/i18n_fr.feature.pickles.ndjson +11 -0
  81. data/testdata/good/i18n_fr.feature.source.ndjson +1 -0
  82. data/testdata/good/i18n_fr.feature.tokens +64 -0
  83. data/testdata/good/i18n_no.feature +7 -0
  84. data/testdata/good/i18n_no.feature.ast.ndjson +1 -0
  85. data/testdata/good/i18n_no.feature.pickles.ndjson +1 -0
  86. data/testdata/good/i18n_no.feature.source.ndjson +1 -0
  87. data/testdata/good/i18n_no.feature.tokens +8 -0
  88. data/testdata/good/incomplete_background_1.feature +6 -0
  89. data/testdata/good/incomplete_background_1.feature.ast.ndjson +1 -0
  90. data/testdata/good/incomplete_background_1.feature.pickles.ndjson +1 -0
  91. data/testdata/good/incomplete_background_1.feature.source.ndjson +1 -0
  92. data/testdata/good/incomplete_background_1.feature.tokens +7 -0
  93. data/testdata/good/incomplete_background_2.feature +7 -0
  94. data/testdata/good/incomplete_background_2.feature.ast.ndjson +1 -0
  95. data/testdata/good/incomplete_background_2.feature.pickles.ndjson +1 -0
  96. data/testdata/good/incomplete_background_2.feature.source.ndjson +1 -0
  97. data/testdata/good/incomplete_background_2.feature.tokens +8 -0
  98. data/testdata/good/incomplete_feature_1.feature +2 -0
  99. data/testdata/good/incomplete_feature_1.feature.ast.ndjson +1 -0
  100. data/testdata/good/incomplete_feature_1.feature.pickles.ndjson +0 -0
  101. data/testdata/good/incomplete_feature_1.feature.source.ndjson +1 -0
  102. data/testdata/good/incomplete_feature_1.feature.tokens +3 -0
  103. data/testdata/good/incomplete_feature_2.feature +1 -0
  104. data/testdata/good/incomplete_feature_2.feature.ast.ndjson +1 -0
  105. data/testdata/good/incomplete_feature_2.feature.pickles.ndjson +0 -0
  106. data/testdata/good/incomplete_feature_2.feature.source.ndjson +1 -0
  107. data/testdata/good/incomplete_feature_2.feature.tokens +2 -0
  108. data/testdata/good/incomplete_feature_3.feature +1 -0
  109. data/testdata/good/incomplete_feature_3.feature.ast.ndjson +1 -0
  110. data/testdata/good/incomplete_feature_3.feature.pickles.ndjson +0 -0
  111. data/testdata/good/incomplete_feature_3.feature.source.ndjson +1 -0
  112. data/testdata/good/incomplete_feature_3.feature.tokens +2 -0
  113. data/testdata/good/incomplete_scenario.feature +6 -0
  114. data/testdata/good/incomplete_scenario.feature.ast.ndjson +1 -0
  115. data/testdata/good/incomplete_scenario.feature.pickles.ndjson +0 -0
  116. data/testdata/good/incomplete_scenario.feature.source.ndjson +1 -0
  117. data/testdata/good/incomplete_scenario.feature.tokens +7 -0
  118. data/testdata/good/incomplete_scenario_outline.feature +24 -0
  119. data/testdata/good/incomplete_scenario_outline.feature.ast.ndjson +1 -0
  120. data/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson +0 -0
  121. data/testdata/good/incomplete_scenario_outline.feature.source.ndjson +1 -0
  122. data/testdata/good/incomplete_scenario_outline.feature.tokens +25 -0
  123. data/testdata/good/language.feature +6 -0
  124. data/testdata/good/language.feature.ast.ndjson +1 -0
  125. data/testdata/good/language.feature.pickles.ndjson +1 -0
  126. data/testdata/good/language.feature.source.ndjson +1 -0
  127. data/testdata/good/language.feature.tokens +7 -0
  128. data/testdata/good/minimal.feature +4 -0
  129. data/testdata/good/minimal.feature.ast.ndjson +1 -0
  130. data/testdata/good/minimal.feature.pickles.ndjson +1 -0
  131. data/testdata/good/minimal.feature.source.ndjson +1 -0
  132. data/testdata/good/minimal.feature.tokens +5 -0
  133. data/testdata/good/readme_example.feature +18 -0
  134. data/testdata/good/readme_example.feature.ast.ndjson +1 -0
  135. data/testdata/good/readme_example.feature.pickles.ndjson +2 -0
  136. data/testdata/good/readme_example.feature.source.ndjson +1 -0
  137. data/testdata/good/readme_example.feature.tokens +19 -0
  138. data/testdata/good/scenario_outline.feature +8 -0
  139. data/testdata/good/scenario_outline.feature.ast.ndjson +1 -0
  140. data/testdata/good/scenario_outline.feature.pickles.ndjson +1 -0
  141. data/testdata/good/scenario_outline.feature.source.ndjson +1 -0
  142. data/testdata/good/scenario_outline.feature.tokens +9 -0
  143. data/testdata/good/scenario_outline_no_newline.feature +8 -0
  144. data/testdata/good/scenario_outline_no_newline.feature.ast.ndjson +1 -0
  145. data/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson +1 -0
  146. data/testdata/good/scenario_outline_no_newline.feature.source.ndjson +1 -0
  147. data/testdata/good/scenario_outline_no_newline.feature.tokens +9 -0
  148. data/testdata/good/scenario_outlines_with_tags.feature +18 -0
  149. data/testdata/good/scenario_outlines_with_tags.feature.ast.ndjson +1 -0
  150. data/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson +2 -0
  151. data/testdata/good/scenario_outlines_with_tags.feature.source.ndjson +1 -0
  152. data/testdata/good/scenario_outlines_with_tags.feature.tokens +19 -0
  153. data/testdata/good/several_examples.feature +17 -0
  154. data/testdata/good/several_examples.feature.ast.ndjson +1 -0
  155. data/testdata/good/several_examples.feature.pickles.ndjson +2 -0
  156. data/testdata/good/several_examples.feature.source.ndjson +1 -0
  157. data/testdata/good/several_examples.feature.tokens +18 -0
  158. data/testdata/good/spaces_in_language.feature +2 -0
  159. data/testdata/good/spaces_in_language.feature.ast.ndjson +1 -0
  160. data/testdata/good/spaces_in_language.feature.pickles.ndjson +0 -0
  161. data/testdata/good/spaces_in_language.feature.source.ndjson +1 -0
  162. data/testdata/good/spaces_in_language.feature.tokens +3 -0
  163. data/testdata/good/tags.feature +25 -0
  164. data/testdata/good/tags.feature.ast.ndjson +1 -0
  165. data/testdata/good/tags.feature.pickles.ndjson +3 -0
  166. data/testdata/good/tags.feature.source.ndjson +1 -0
  167. data/testdata/good/tags.feature.tokens +26 -0
  168. metadata +176 -25
  169. data/bin/gherkin-generate-ast +0 -22
  170. data/bin/gherkin-generate-pickles +0 -26
@@ -0,0 +1,69 @@
1
+ require 'gherkin/parser'
2
+ require 'gherkin/pickles/compiler'
3
+
4
+ module Gherkin
5
+ module Stream
6
+ class GherkinEvents
7
+ def initialize(options)
8
+ @options = options
9
+ @parser = Gherkin::Parser.new
10
+ @compiler = Gherkin::Pickles::Compiler.new
11
+ end
12
+
13
+ def enum(source_event)
14
+ Enumerator.new do |y|
15
+ uri = source_event['uri']
16
+ source = source_event['data']
17
+ begin
18
+ gherkin_document = @parser.parse(source)
19
+
20
+ if (@options[:print_source])
21
+ y.yield source_event
22
+ end
23
+ if (@options[:print_ast])
24
+ y.yield({
25
+ type: 'gherkin-document',
26
+ uri: uri,
27
+ document: gherkin_document
28
+ })
29
+ end
30
+ if (@options[:print_pickles])
31
+ pickles = @compiler.compile(gherkin_document)
32
+ pickles.each do |pickle|
33
+ y.yield({
34
+ type: 'pickle',
35
+ uri: uri,
36
+ pickle: pickle
37
+ })
38
+ end
39
+ end
40
+ rescue Gherkin::CompositeParserException => e
41
+ yield_errors(y, e.errors, uri)
42
+ rescue Gherkin::ParserError => e
43
+ yield_errors(y, [e], uri)
44
+ end
45
+ end
46
+ end
47
+
48
+ def yield_errors(y, errors, uri)
49
+ errors.each do |error|
50
+ y.yield({
51
+ type: 'attachment',
52
+ source: {
53
+ uri: uri,
54
+ start: {
55
+ line: error.location[:line],
56
+ column: error.location[:column]
57
+ }
58
+ },
59
+ data: error.message,
60
+ media: {
61
+ encoding: 'utf-8',
62
+ type: 'text/vnd.cucumber.stacktrace+plain'
63
+ }
64
+ })
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,26 @@
1
+ module Gherkin
2
+ module Stream
3
+ class SourceEvents
4
+ def initialize(paths)
5
+ @paths = paths
6
+ end
7
+
8
+ def enum
9
+ Enumerator.new do |y|
10
+ @paths.each do |path|
11
+ event = {
12
+ 'type' => 'source',
13
+ 'uri' => path,
14
+ 'data' => File.open(path, 'r:UTF-8', &:read),
15
+ 'media' => {
16
+ 'encoding' => 'utf-8',
17
+ 'type' => 'text/vnd.cucumber.gherkin+plain'
18
+ }
19
+ }
20
+ y.yield(event)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -25,7 +25,7 @@ module Gherkin
25
25
  end
26
26
 
27
27
  def read
28
- location = {line: @line_number += 1}
28
+ location = {line: @line_number += 1, column: 0}
29
29
  if @io.nil? || line = @io.gets
30
30
  gherkin_line = line ? GherkinLine.new(line, location[:line]) : nil
31
31
  Token.new(gherkin_line, location)
@@ -0,0 +1,14 @@
1
+ Feature: Inconsistent cell counts
2
+
3
+ Scenario: minimalistic
4
+ Given a data table with inconsistent cell count
5
+ | foo | bar |
6
+ | boz |
7
+
8
+
9
+ Scenario Outline: minimalistic
10
+ Given the <what>
11
+
12
+ Examples:
13
+ | what |
14
+ | minimalism | extra |
@@ -0,0 +1,2 @@
1
+ {"data":"(6:7): inconsistent cell count within the table","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":7,"line":6},"uri":"testdata/bad/inconsistent_cell_count.feature"},"type":"attachment"}
2
+ {"data":"(14:5): inconsistent cell count within the table","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":5,"line":14},"uri":"testdata/bad/inconsistent_cell_count.feature"},"type":"attachment"}
@@ -0,0 +1,6 @@
1
+ #language:no-such
2
+
3
+ Feature: Minimal
4
+
5
+ Scenario: minimalistic
6
+ Given the minimalism
@@ -0,0 +1 @@
1
+ {"data":"(1:1): Language not supported: no-such","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":1},"uri":"testdata/bad/invalid_language.feature"},"type":"attachment"}
@@ -0,0 +1,9 @@
1
+
2
+ invalid line here
3
+
4
+ Feature: Multiple parser errors
5
+
6
+ Scenario: minimalistic
7
+ Given the minimalism
8
+
9
+ another invalid line here
@@ -0,0 +1,2 @@
1
+ {"data":"(2:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'invalid line here'","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":2},"uri":"testdata/bad/multiple_parser_errors.feature"},"type":"attachment"}
2
+ {"data":"(9:1): expected: #EOF, #TableRow, #DocStringSeparator, #StepLine, #TagLine, #ScenarioLine, #ScenarioOutlineLine, #Comment, #Empty, got 'another invalid line here'","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":9},"uri":"testdata/bad/multiple_parser_errors.feature"},"type":"attachment"}
@@ -0,0 +1,2 @@
1
+ not gherkin
2
+
@@ -0,0 +1 @@
1
+ {"data":"(1:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'not gherkin'","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":1},"uri":"testdata/bad/not_gherkin.feature"},"type":"attachment"}
@@ -0,0 +1,7 @@
1
+
2
+ invalid line here
3
+
4
+ Feature: Single parser error
5
+
6
+ Scenario: minimalistic
7
+ Given the minimalism
@@ -0,0 +1 @@
1
+ {"data":"(2:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'invalid line here'","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":2},"uri":"testdata/bad/single_parser_error.feature"},"type":"attachment"}
@@ -0,0 +1,6 @@
1
+ Feature: Unexpected end of file
2
+
3
+ Scenario Outline: minimalistic
4
+ Given the minimalism
5
+
6
+ @tag
@@ -0,0 +1 @@
1
+ {"data":"(7:0): unexpected end of file, expected: #TagLine, #ScenarioLine, #ScenarioOutlineLine, #Comment, #Empty","media":{"encoding":"utf-8","type":"text/vnd.cucumber.stacktrace+plain"},"source":{"start":{"column":0,"line":7},"uri":"testdata/bad/unexpected_eof.feature"},"type":"attachment"}
@@ -0,0 +1,8 @@
1
+ Feature: Background
2
+
3
+ Background: a simple background
4
+ Given the minimalism inside a background
5
+
6
+
7
+ Scenario: minimalistic
8
+ Given the minimalism
@@ -0,0 +1 @@
1
+ {"document":{"comments":[],"feature":{"children":[{"keyword":"Background","location":{"column":3,"line":3},"name":"a simple background","steps":[{"keyword":"Given ","location":{"column":5,"line":4},"text":"the minimalism inside a background","type":"Step"}],"type":"Background"},{"keyword":"Scenario","location":{"column":3,"line":7},"name":"minimalistic","steps":[{"keyword":"Given ","location":{"column":5,"line":8},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"}],"keyword":"Feature","language":"en","location":{"column":1,"line":1},"name":"Background","tags":[],"type":"Feature"},"type":"GherkinDocument"},"type":"gherkin-document","uri":"testdata/good/background.feature"}
@@ -0,0 +1 @@
1
+ {"pickle":{"language":"en","locations":[{"column":3,"line":7}],"name":"minimalistic","steps":[{"arguments":[],"locations":[{"column":11,"line":4}],"text":"the minimalism inside a background"},{"arguments":[],"locations":[{"column":11,"line":8}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/background.feature"}
@@ -0,0 +1 @@
1
+ {"data":"Feature: Background\n\n Background: a simple background\n Given the minimalism inside a background\n\n\n Scenario: minimalistic\n Given the minimalism\n","media":{"encoding":"utf-8","type":"text/vnd.cucumber.gherkin+plain"},"type":"source","uri":"testdata/good/background.feature"}
@@ -0,0 +1,9 @@
1
+ (1:1)FeatureLine:Feature/Background/
2
+ (2:1)Empty://
3
+ (3:3)BackgroundLine:Background/a simple background/
4
+ (4:5)StepLine:Given /the minimalism inside a background/
5
+ (5:1)Empty://
6
+ (6:1)Empty://
7
+ (7:3)ScenarioLine:Scenario/minimalistic/
8
+ (8:5)StepLine:Given /the minimalism/
9
+ EOF
@@ -0,0 +1,18 @@
1
+ Feature: DataTables
2
+
3
+ Scenario: minimalistic
4
+ Given a simple data table
5
+ | foo | bar |
6
+ | boz | boo |
7
+ And a data table with a single cell
8
+ | foo |
9
+ And a data table with different fromatting
10
+ | foo|bar| boz |
11
+ And a data table with an empty cell
12
+ |foo||boz|
13
+ And a data table with comments and newlines inside
14
+ | foo | bar |
15
+
16
+ | boz | boo |
17
+ # this is a comment
18
+ | boz2 | boo2 |
@@ -0,0 +1 @@
1
+ {"document":{"comments":[{"location":{"column":1,"line":17},"text":" # this is a comment","type":"Comment"}],"feature":{"children":[{"keyword":"Scenario","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"argument":{"location":{"column":7,"line":5},"rows":[{"cells":[{"location":{"column":9,"line":5},"type":"TableCell","value":"foo"},{"location":{"column":15,"line":5},"type":"TableCell","value":"bar"}],"location":{"column":7,"line":5},"type":"TableRow"},{"cells":[{"location":{"column":9,"line":6},"type":"TableCell","value":"boz"},{"location":{"column":15,"line":6},"type":"TableCell","value":"boo"}],"location":{"column":7,"line":6},"type":"TableRow"}],"type":"DataTable"},"keyword":"Given ","location":{"column":5,"line":4},"text":"a simple data table","type":"Step"},{"argument":{"location":{"column":7,"line":8},"rows":[{"cells":[{"location":{"column":9,"line":8},"type":"TableCell","value":"foo"}],"location":{"column":7,"line":8},"type":"TableRow"}],"type":"DataTable"},"keyword":"And ","location":{"column":5,"line":7},"text":"a data table with a single cell","type":"Step"},{"argument":{"location":{"column":7,"line":10},"rows":[{"cells":[{"location":{"column":11,"line":10},"type":"TableCell","value":"foo"},{"location":{"column":15,"line":10},"type":"TableCell","value":"bar"},{"location":{"column":23,"line":10},"type":"TableCell","value":"boz"}],"location":{"column":7,"line":10},"type":"TableRow"}],"type":"DataTable"},"keyword":"And ","location":{"column":5,"line":9},"text":"a data table with different fromatting","type":"Step"},{"argument":{"location":{"column":7,"line":12},"rows":[{"cells":[{"location":{"column":8,"line":12},"type":"TableCell","value":"foo"},{"location":{"column":12,"line":12},"type":"TableCell","value":""},{"location":{"column":13,"line":12},"type":"TableCell","value":"boz"}],"location":{"column":7,"line":12},"type":"TableRow"}],"type":"DataTable"},"keyword":"And ","location":{"column":5,"line":11},"text":"a data table with an empty cell","type":"Step"},{"argument":{"location":{"column":7,"line":14},"rows":[{"cells":[{"location":{"column":9,"line":14},"type":"TableCell","value":"foo"},{"location":{"column":15,"line":14},"type":"TableCell","value":"bar"}],"location":{"column":7,"line":14},"type":"TableRow"},{"cells":[{"location":{"column":9,"line":16},"type":"TableCell","value":"boz"},{"location":{"column":16,"line":16},"type":"TableCell","value":"boo"}],"location":{"column":7,"line":16},"type":"TableRow"},{"cells":[{"location":{"column":9,"line":18},"type":"TableCell","value":"boz2"},{"location":{"column":16,"line":18},"type":"TableCell","value":"boo2"}],"location":{"column":7,"line":18},"type":"TableRow"}],"type":"DataTable"},"keyword":"And ","location":{"column":5,"line":13},"text":"a data table with comments and newlines inside","type":"Step"}],"tags":[],"type":"Scenario"}],"keyword":"Feature","language":"en","location":{"column":1,"line":1},"name":"DataTables","tags":[],"type":"Feature"},"type":"GherkinDocument"},"type":"gherkin-document","uri":"testdata/good/datatables.feature"}
@@ -0,0 +1 @@
1
+ {"pickle":{"language":"en","locations":[{"column":3,"line":3}],"name":"minimalistic","steps":[{"arguments":[{"rows":[{"cells":[{"location":{"column":9,"line":5},"value":"foo"},{"location":{"column":15,"line":5},"value":"bar"}]},{"cells":[{"location":{"column":9,"line":6},"value":"boz"},{"location":{"column":15,"line":6},"value":"boo"}]}]}],"locations":[{"column":11,"line":4}],"text":"a simple data table"},{"arguments":[{"rows":[{"cells":[{"location":{"column":9,"line":8},"value":"foo"}]}]}],"locations":[{"column":9,"line":7}],"text":"a data table with a single cell"},{"arguments":[{"rows":[{"cells":[{"location":{"column":11,"line":10},"value":"foo"},{"location":{"column":15,"line":10},"value":"bar"},{"location":{"column":23,"line":10},"value":"boz"}]}]}],"locations":[{"column":9,"line":9}],"text":"a data table with different fromatting"},{"arguments":[{"rows":[{"cells":[{"location":{"column":8,"line":12},"value":"foo"},{"location":{"column":12,"line":12},"value":""},{"location":{"column":13,"line":12},"value":"boz"}]}]}],"locations":[{"column":9,"line":11}],"text":"a data table with an empty cell"},{"arguments":[{"rows":[{"cells":[{"location":{"column":9,"line":14},"value":"foo"},{"location":{"column":15,"line":14},"value":"bar"}]},{"cells":[{"location":{"column":9,"line":16},"value":"boz"},{"location":{"column":16,"line":16},"value":"boo"}]},{"cells":[{"location":{"column":9,"line":18},"value":"boz2"},{"location":{"column":16,"line":18},"value":"boo2"}]}]}],"locations":[{"column":9,"line":13}],"text":"a data table with comments and newlines inside"}],"tags":[]},"type":"pickle","uri":"testdata/good/datatables.feature"}
@@ -0,0 +1 @@
1
+ {"data":"Feature: DataTables\n\n Scenario: minimalistic\n Given a simple data table\n | foo | bar |\r\n | boz | boo |\n And a data table with a single cell\n | foo |\n And a data table with different fromatting\n | foo|bar| boz | \n And a data table with an empty cell\n |foo||boz|\n And a data table with comments and newlines inside\n | foo | bar |\r\n\r\n | boz | boo |\r\n # this is a comment\r\n | boz2 | boo2 |\n","media":{"encoding":"utf-8","type":"text/vnd.cucumber.gherkin+plain"},"type":"source","uri":"testdata/good/datatables.feature"}
@@ -0,0 +1,19 @@
1
+ (1:1)FeatureLine:Feature/DataTables/
2
+ (2:1)Empty://
3
+ (3:3)ScenarioLine:Scenario/minimalistic/
4
+ (4:5)StepLine:Given /a simple data table/
5
+ (5:7)TableRow://9:foo,15:bar
6
+ (6:7)TableRow://9:boz,15:boo
7
+ (7:5)StepLine:And /a data table with a single cell/
8
+ (8:7)TableRow://9:foo
9
+ (9:5)StepLine:And /a data table with different fromatting/
10
+ (10:7)TableRow://11:foo,15:bar,23:boz
11
+ (11:5)StepLine:And /a data table with an empty cell/
12
+ (12:7)TableRow://8:foo,12:,13:boz
13
+ (13:5)StepLine:And /a data table with comments and newlines inside/
14
+ (14:7)TableRow://9:foo,15:bar
15
+ (15:1)Empty://
16
+ (16:7)TableRow://9:boz,16:boo
17
+ (17:1)Comment:/ # this is a comment/
18
+ (18:7)TableRow://9:boz2,16:boo2
19
+ EOF
@@ -0,0 +1,52 @@
1
+ Feature: Descriptions everywhere
2
+ This is a single line description
3
+
4
+ Scenario: two lines
5
+ This description
6
+ has two lines and indented with two spaces
7
+ Given the minimalism
8
+
9
+ Scenario: without indentation
10
+ This is a description without indentation
11
+ Given the minimalism
12
+
13
+ Scenario: empty lines in the middle
14
+ This description
15
+
16
+ has an empty line in the middle
17
+ Given the minimalism
18
+
19
+ Scenario: empty lines around
20
+
21
+ This description
22
+ has an empty lines around
23
+
24
+ Given the minimalism
25
+
26
+ Scenario: comment after description
27
+ This description
28
+ has a comment after
29
+
30
+ # this is a comment
31
+ Given the minimalism
32
+
33
+ Scenario: comment right after description
34
+ This description
35
+ has a comment right after
36
+ # this is another comment
37
+
38
+ Given the minimalism
39
+
40
+ Scenario: description with escaped docstring separator
41
+ This description has an \"\"\" (escaped docstring sparator)
42
+
43
+ Given the minimalism
44
+
45
+ Scenario Outline: scenario outline with a description
46
+ This is a scenario outline description
47
+ Given the minimalism
48
+
49
+ Examples: examples with description
50
+ This is an examples description
51
+ | foo |
52
+ | bar |
@@ -0,0 +1 @@
1
+ {"document":{"comments":[{"location":{"column":1,"line":30},"text":"# this is a comment","type":"Comment"},{"location":{"column":1,"line":36},"text":" # this is another comment","type":"Comment"}],"feature":{"children":[{"description":" This description\n has two lines and indented with two spaces","keyword":"Scenario","location":{"column":3,"line":4},"name":"two lines","steps":[{"keyword":"Given ","location":{"column":5,"line":7},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":"This is a description without indentation","keyword":"Scenario","location":{"column":1,"line":9},"name":"without indentation","steps":[{"keyword":"Given ","location":{"column":3,"line":11},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":" This description\n\n has an empty line in the middle","keyword":"Scenario","location":{"column":3,"line":13},"name":"empty lines in the middle","steps":[{"keyword":"Given ","location":{"column":5,"line":17},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":" This description\n has an empty lines around","keyword":"Scenario","location":{"column":3,"line":19},"name":"empty lines around","steps":[{"keyword":"Given ","location":{"column":5,"line":24},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":" This description\n has a comment after","keyword":"Scenario","location":{"column":3,"line":26},"name":"comment after description","steps":[{"keyword":"Given ","location":{"column":5,"line":31},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":" This description\n has a comment right after","keyword":"Scenario","location":{"column":3,"line":33},"name":"comment right after description","steps":[{"keyword":"Given ","location":{"column":5,"line":38},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":" This description has an \\\"\\\"\\\" (escaped docstring sparator)","keyword":"Scenario","location":{"column":3,"line":40},"name":"description with escaped docstring separator","steps":[{"keyword":"Given ","location":{"column":5,"line":43},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"},{"description":"This is a scenario outline description","examples":[{"description":"This is an examples description","keyword":"Examples","location":{"column":3,"line":49},"name":"examples with description","tableBody":[{"cells":[{"location":{"column":7,"line":52},"type":"TableCell","value":"bar"}],"location":{"column":5,"line":52},"type":"TableRow"}],"tableHeader":{"cells":[{"location":{"column":7,"line":51},"type":"TableCell","value":"foo"}],"location":{"column":5,"line":51},"type":"TableRow"},"tags":[],"type":"Examples"}],"keyword":"Scenario Outline","location":{"column":3,"line":45},"name":"scenario outline with a description","steps":[{"keyword":"Given ","location":{"column":5,"line":47},"text":"the minimalism","type":"Step"}],"tags":[],"type":"ScenarioOutline"}],"description":" This is a single line description","keyword":"Feature","language":"en","location":{"column":1,"line":1},"name":"Descriptions everywhere","tags":[],"type":"Feature"},"type":"GherkinDocument"},"type":"gherkin-document","uri":"testdata/good/descriptions.feature"}
@@ -0,0 +1,8 @@
1
+ {"pickle":{"language":"en","locations":[{"column":3,"line":4}],"name":"two lines","steps":[{"arguments":[],"locations":[{"column":11,"line":7}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
2
+ {"pickle":{"language":"en","locations":[{"column":1,"line":9}],"name":"without indentation","steps":[{"arguments":[],"locations":[{"column":9,"line":11}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
3
+ {"pickle":{"language":"en","locations":[{"column":3,"line":13}],"name":"empty lines in the middle","steps":[{"arguments":[],"locations":[{"column":11,"line":17}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
4
+ {"pickle":{"language":"en","locations":[{"column":3,"line":19}],"name":"empty lines around","steps":[{"arguments":[],"locations":[{"column":11,"line":24}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
5
+ {"pickle":{"language":"en","locations":[{"column":3,"line":26}],"name":"comment after description","steps":[{"arguments":[],"locations":[{"column":11,"line":31}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
6
+ {"pickle":{"language":"en","locations":[{"column":3,"line":33}],"name":"comment right after description","steps":[{"arguments":[],"locations":[{"column":11,"line":38}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
7
+ {"pickle":{"language":"en","locations":[{"column":3,"line":40}],"name":"description with escaped docstring separator","steps":[{"arguments":[],"locations":[{"column":11,"line":43}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
8
+ {"pickle":{"language":"en","locations":[{"column":5,"line":52},{"column":3,"line":45}],"name":"scenario outline with a description","steps":[{"arguments":[],"locations":[{"column":5,"line":52},{"column":11,"line":47}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/descriptions.feature"}
@@ -0,0 +1 @@
1
+ {"data":"Feature: Descriptions everywhere\n This is a single line description\n\n Scenario: two lines\n This description\n has two lines and indented with two spaces\n Given the minimalism\n\nScenario: without indentation\nThis is a description without indentation\n Given the minimalism\n\n Scenario: empty lines in the middle\n This description\n\n has an empty line in the middle\n Given the minimalism\n\n Scenario: empty lines around\n\n This description\n has an empty lines around\n\n Given the minimalism\n\n Scenario: comment after description\n This description\n has a comment after\n\n# this is a comment\n Given the minimalism\n\n Scenario: comment right after description\n This description\n has a comment right after\n # this is another comment\n\n Given the minimalism\n\n Scenario: description with escaped docstring separator\n This description has an \\\"\\\"\\\" (escaped docstring sparator)\n\n Given the minimalism\n\n Scenario Outline: scenario outline with a description\nThis is a scenario outline description\n Given the minimalism\n\n Examples: examples with description\nThis is an examples description\n | foo |\r\n | bar |\r\n","media":{"encoding":"utf-8","type":"text/vnd.cucumber.gherkin+plain"},"type":"source","uri":"testdata/good/descriptions.feature"}
@@ -0,0 +1,53 @@
1
+ (1:1)FeatureLine:Feature/Descriptions everywhere/
2
+ (2:1)Other:/ This is a single line description/
3
+ (3:1)Other://
4
+ (4:3)ScenarioLine:Scenario/two lines/
5
+ (5:1)Other:/ This description/
6
+ (6:1)Other:/ has two lines and indented with two spaces/
7
+ (7:5)StepLine:Given /the minimalism/
8
+ (8:1)Empty://
9
+ (9:1)ScenarioLine:Scenario/without indentation/
10
+ (10:1)Other:/This is a description without indentation/
11
+ (11:3)StepLine:Given /the minimalism/
12
+ (12:1)Empty://
13
+ (13:3)ScenarioLine:Scenario/empty lines in the middle/
14
+ (14:1)Other:/ This description/
15
+ (15:1)Other://
16
+ (16:1)Other:/ has an empty line in the middle/
17
+ (17:5)StepLine:Given /the minimalism/
18
+ (18:1)Empty://
19
+ (19:3)ScenarioLine:Scenario/empty lines around/
20
+ (20:1)Empty://
21
+ (21:1)Other:/ This description/
22
+ (22:1)Other:/ has an empty lines around/
23
+ (23:1)Other://
24
+ (24:5)StepLine:Given /the minimalism/
25
+ (25:1)Empty://
26
+ (26:3)ScenarioLine:Scenario/comment after description/
27
+ (27:1)Other:/ This description/
28
+ (28:1)Other:/ has a comment after/
29
+ (29:1)Other://
30
+ (30:1)Comment:/# this is a comment/
31
+ (31:5)StepLine:Given /the minimalism/
32
+ (32:1)Empty://
33
+ (33:3)ScenarioLine:Scenario/comment right after description/
34
+ (34:1)Other:/ This description/
35
+ (35:1)Other:/ has a comment right after/
36
+ (36:1)Comment:/ # this is another comment/
37
+ (37:1)Empty://
38
+ (38:5)StepLine:Given /the minimalism/
39
+ (39:1)Empty://
40
+ (40:3)ScenarioLine:Scenario/description with escaped docstring separator/
41
+ (41:1)Other:/ This description has an \"\"\" (escaped docstring sparator)/
42
+ (42:1)Other://
43
+ (43:5)StepLine:Given /the minimalism/
44
+ (44:1)Empty://
45
+ (45:3)ScenarioOutlineLine:Scenario Outline/scenario outline with a description/
46
+ (46:1)Other:/This is a scenario outline description/
47
+ (47:5)StepLine:Given /the minimalism/
48
+ (48:1)Empty://
49
+ (49:3)ExamplesLine:Examples/examples with description/
50
+ (50:1)Other:/This is an examples description/
51
+ (51:5)TableRow://7:foo
52
+ (52:5)TableRow://7:bar
53
+ EOF
@@ -0,0 +1,43 @@
1
+ Feature: DocString variations
2
+
3
+ Scenario: minimalistic
4
+ Given a simple DocString
5
+ """
6
+ first line (no indent)
7
+ second line (indented with two spaces)
8
+
9
+ third line was empty
10
+ """
11
+ Given a DocString with content type
12
+ """xml
13
+ <foo>
14
+ <bar />
15
+ </foo>
16
+ """
17
+ And a DocString with wrong indentation
18
+ """
19
+ wrongly indented line
20
+ """
21
+ And a DocString with alternative separator
22
+ ```
23
+ first line
24
+ second line
25
+ ```
26
+ And a DocString with normal separator inside
27
+ ```
28
+ first line
29
+ """
30
+ third line
31
+ ```
32
+ And a DocString with alternative separator inside
33
+ """
34
+ first line
35
+ ```
36
+ third line
37
+ """
38
+ And a DocString with escaped separator inside
39
+ """
40
+ first line
41
+ \"\"\"
42
+ third line
43
+ """
@@ -0,0 +1 @@
1
+ {"document":{"comments":[],"feature":{"children":[{"keyword":"Scenario","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"argument":{"content":"first line (no indent)\n second line (indented with two spaces)\n\nthird line was empty","location":{"column":7,"line":5},"type":"DocString"},"keyword":"Given ","location":{"column":5,"line":4},"text":"a simple DocString","type":"Step"},{"argument":{"content":"<foo>\n <bar />\n</foo>","contentType":"xml","location":{"column":7,"line":12},"type":"DocString"},"keyword":"Given ","location":{"column":5,"line":11},"text":"a DocString with content type","type":"Step"},{"argument":{"content":"wrongly indented line","location":{"column":7,"line":18},"type":"DocString"},"keyword":"And ","location":{"column":5,"line":17},"text":"a DocString with wrong indentation","type":"Step"},{"argument":{"content":"first line\nsecond line","location":{"column":7,"line":22},"type":"DocString"},"keyword":"And ","location":{"column":5,"line":21},"text":"a DocString with alternative separator","type":"Step"},{"argument":{"content":"first line\n\"\"\"\nthird line","location":{"column":7,"line":27},"type":"DocString"},"keyword":"And ","location":{"column":5,"line":26},"text":"a DocString with normal separator inside","type":"Step"},{"argument":{"content":"first line\n```\nthird line","location":{"column":7,"line":33},"type":"DocString"},"keyword":"And ","location":{"column":5,"line":32},"text":"a DocString with alternative separator inside","type":"Step"},{"argument":{"content":"first line\n\"\"\"\nthird line","location":{"column":7,"line":39},"type":"DocString"},"keyword":"And ","location":{"column":5,"line":38},"text":"a DocString with escaped separator inside","type":"Step"}],"tags":[],"type":"Scenario"}],"keyword":"Feature","language":"en","location":{"column":1,"line":1},"name":"DocString variations","tags":[],"type":"Feature"},"type":"GherkinDocument"},"type":"gherkin-document","uri":"testdata/good/docstrings.feature"}
@@ -0,0 +1 @@
1
+ {"pickle":{"language":"en","locations":[{"column":3,"line":3}],"name":"minimalistic","steps":[{"arguments":[{"content":"first line (no indent)\n second line (indented with two spaces)\n\nthird line was empty","location":{"column":7,"line":5}}],"locations":[{"column":11,"line":4}],"text":"a simple DocString"},{"arguments":[{"content":"<foo>\n <bar />\n</foo>","location":{"column":7,"line":12}}],"locations":[{"column":11,"line":11}],"text":"a DocString with content type"},{"arguments":[{"content":"wrongly indented line","location":{"column":7,"line":18}}],"locations":[{"column":9,"line":17}],"text":"a DocString with wrong indentation"},{"arguments":[{"content":"first line\nsecond line","location":{"column":7,"line":22}}],"locations":[{"column":9,"line":21}],"text":"a DocString with alternative separator"},{"arguments":[{"content":"first line\n\"\"\"\nthird line","location":{"column":7,"line":27}}],"locations":[{"column":9,"line":26}],"text":"a DocString with normal separator inside"},{"arguments":[{"content":"first line\n```\nthird line","location":{"column":7,"line":33}}],"locations":[{"column":9,"line":32}],"text":"a DocString with alternative separator inside"},{"arguments":[{"content":"first line\n\"\"\"\nthird line","location":{"column":7,"line":39}}],"locations":[{"column":9,"line":38}],"text":"a DocString with escaped separator inside"}],"tags":[]},"type":"pickle","uri":"testdata/good/docstrings.feature"}
@@ -0,0 +1 @@
1
+ {"data":"Feature: DocString variations\n\n Scenario: minimalistic\n Given a simple DocString\n \"\"\"\n first line (no indent)\n second line (indented with two spaces)\n\n third line was empty\n \"\"\"\n Given a DocString with content type\n \"\"\"xml\n <foo>\n <bar />\n </foo>\n \"\"\"\n And a DocString with wrong indentation\n \"\"\"\n wrongly indented line\n \"\"\"\n And a DocString with alternative separator\n ```\n first line\n second line\n ```\n And a DocString with normal separator inside\n ```\n first line\n \"\"\"\n third line\n ```\n And a DocString with alternative separator inside\n \"\"\"\n first line\n ```\n third line\n \"\"\"\n And a DocString with escaped separator inside\n \"\"\"\n first line\n \\\"\\\"\\\"\n third line\n \"\"\"\n","media":{"encoding":"utf-8","type":"text/vnd.cucumber.gherkin+plain"},"type":"source","uri":"testdata/good/docstrings.feature"}
@@ -0,0 +1,44 @@
1
+ (1:1)FeatureLine:Feature/DocString variations/
2
+ (2:1)Empty://
3
+ (3:3)ScenarioLine:Scenario/minimalistic/
4
+ (4:5)StepLine:Given /a simple DocString/
5
+ (5:7)DocStringSeparator://
6
+ (6:1)Other:/first line (no indent)/
7
+ (7:1)Other:/ second line (indented with two spaces)/
8
+ (8:1)Other://
9
+ (9:1)Other:/third line was empty/
10
+ (10:7)DocStringSeparator://
11
+ (11:5)StepLine:Given /a DocString with content type/
12
+ (12:7)DocStringSeparator:/xml/
13
+ (13:1)Other:/<foo>/
14
+ (14:1)Other:/ <bar />/
15
+ (15:1)Other:/</foo>/
16
+ (16:7)DocStringSeparator://
17
+ (17:5)StepLine:And /a DocString with wrong indentation/
18
+ (18:7)DocStringSeparator://
19
+ (19:1)Other:/wrongly indented line/
20
+ (20:7)DocStringSeparator://
21
+ (21:5)StepLine:And /a DocString with alternative separator/
22
+ (22:7)DocStringSeparator://
23
+ (23:1)Other:/first line/
24
+ (24:1)Other:/second line/
25
+ (25:7)DocStringSeparator://
26
+ (26:5)StepLine:And /a DocString with normal separator inside/
27
+ (27:7)DocStringSeparator://
28
+ (28:1)Other:/first line/
29
+ (29:1)Other:/"""/
30
+ (30:1)Other:/third line/
31
+ (31:7)DocStringSeparator://
32
+ (32:5)StepLine:And /a DocString with alternative separator inside/
33
+ (33:7)DocStringSeparator://
34
+ (34:1)Other:/first line/
35
+ (35:1)Other:/```/
36
+ (36:1)Other:/third line/
37
+ (37:7)DocStringSeparator://
38
+ (38:5)StepLine:And /a DocString with escaped separator inside/
39
+ (39:7)DocStringSeparator://
40
+ (40:1)Other:/first line/
41
+ (41:1)Other:/"""/
42
+ (42:1)Other:/third line/
43
+ (43:7)DocStringSeparator://
44
+ EOF