gherkin 1.0.30-universal-dotnet

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.
Files changed (104) hide show
  1. data/.gitattributes +2 -0
  2. data/.gitignore +9 -0
  3. data/.mailmap +2 -0
  4. data/History.txt +187 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +59 -0
  7. data/Rakefile +58 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/gherkin +5 -0
  10. data/cucumber.yml +3 -0
  11. data/features/escaped_pipes.feature +8 -0
  12. data/features/feature_parser.feature +226 -0
  13. data/features/native_lexer.feature +19 -0
  14. data/features/parser_with_native_lexer.feature +205 -0
  15. data/features/pretty_printer.feature +14 -0
  16. data/features/step_definitions/eyeball_steps.rb +3 -0
  17. data/features/step_definitions/gherkin_steps.rb +30 -0
  18. data/features/step_definitions/pretty_formatter_steps.rb +55 -0
  19. data/features/steps_parser.feature +46 -0
  20. data/features/support/env.rb +33 -0
  21. data/ikvm/.gitignore +3 -0
  22. data/java/.gitignore +2 -0
  23. data/java/src/main/java/gherkin/lexer/.gitignore +1 -0
  24. data/java/src/main/resources/gherkin/.gitignore +1 -0
  25. data/lib/.gitignore +4 -0
  26. data/lib/gherkin.rb +2 -0
  27. data/lib/gherkin/c_lexer.rb +17 -0
  28. data/lib/gherkin/cli/main.rb +33 -0
  29. data/lib/gherkin/formatter/argument.rb +27 -0
  30. data/lib/gherkin/formatter/colors.rb +119 -0
  31. data/lib/gherkin/formatter/escaping.rb +15 -0
  32. data/lib/gherkin/formatter/monochrome_format.rb +9 -0
  33. data/lib/gherkin/formatter/pretty_formatter.rb +168 -0
  34. data/lib/gherkin/i18n.rb +176 -0
  35. data/lib/gherkin/i18n.yml +588 -0
  36. data/lib/gherkin/i18n_lexer.rb +38 -0
  37. data/lib/gherkin/native.rb +7 -0
  38. data/lib/gherkin/native/ikvm.rb +55 -0
  39. data/lib/gherkin/native/java.rb +47 -0
  40. data/lib/gherkin/native/null.rb +9 -0
  41. data/lib/gherkin/parser/event.rb +45 -0
  42. data/lib/gherkin/parser/filter_listener.rb +199 -0
  43. data/lib/gherkin/parser/meta.txt +5 -0
  44. data/lib/gherkin/parser/parser.rb +142 -0
  45. data/lib/gherkin/parser/root.txt +11 -0
  46. data/lib/gherkin/parser/steps.txt +4 -0
  47. data/lib/gherkin/parser/tag_expression.rb +50 -0
  48. data/lib/gherkin/rb_lexer.rb +8 -0
  49. data/lib/gherkin/rb_lexer/.gitignore +1 -0
  50. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  51. data/lib/gherkin/rubify.rb +18 -0
  52. data/lib/gherkin/tools.rb +8 -0
  53. data/lib/gherkin/tools/files.rb +35 -0
  54. data/lib/gherkin/tools/reformat.rb +19 -0
  55. data/lib/gherkin/tools/stats.rb +21 -0
  56. data/lib/gherkin/tools/stats_listener.rb +57 -0
  57. data/ragel/i18n/.gitignore +1 -0
  58. data/ragel/lexer.c.rl.erb +425 -0
  59. data/ragel/lexer.java.rl.erb +216 -0
  60. data/ragel/lexer.rb.rl.erb +173 -0
  61. data/ragel/lexer_common.rl.erb +50 -0
  62. data/spec/gherkin/c_lexer_spec.rb +21 -0
  63. data/spec/gherkin/csharp_lexer_spec.rb +20 -0
  64. data/spec/gherkin/fixtures/1.feature +8 -0
  65. data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
  66. data/spec/gherkin/fixtures/complex.feature +45 -0
  67. data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
  68. data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
  69. data/spec/gherkin/fixtures/i18n_no.feature +7 -0
  70. data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
  71. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  72. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  73. data/spec/gherkin/fixtures/with_bom.feature +3 -0
  74. data/spec/gherkin/formatter/argument_spec.rb +28 -0
  75. data/spec/gherkin/formatter/colors_spec.rb +19 -0
  76. data/spec/gherkin/formatter/pretty_formatter_spec.rb +162 -0
  77. data/spec/gherkin/formatter/spaces.feature +9 -0
  78. data/spec/gherkin/formatter/tabs.feature +9 -0
  79. data/spec/gherkin/i18n_lexer_spec.rb +26 -0
  80. data/spec/gherkin/i18n_spec.rb +144 -0
  81. data/spec/gherkin/java_lexer_spec.rb +21 -0
  82. data/spec/gherkin/parser/filter_listener_spec.rb +390 -0
  83. data/spec/gherkin/parser/parser_spec.rb +50 -0
  84. data/spec/gherkin/parser/tag_expression_spec.rb +116 -0
  85. data/spec/gherkin/rb_lexer_spec.rb +19 -0
  86. data/spec/gherkin/sexp_recorder.rb +32 -0
  87. data/spec/gherkin/shared/lexer_spec.rb +550 -0
  88. data/spec/gherkin/shared/py_string_spec.rb +150 -0
  89. data/spec/gherkin/shared/row_spec.rb +104 -0
  90. data/spec/gherkin/shared/tags_spec.rb +50 -0
  91. data/spec/spec_helper.rb +87 -0
  92. data/tasks/bench.rake +188 -0
  93. data/tasks/bench/feature_builder.rb +49 -0
  94. data/tasks/bench/generated/.gitignore +1 -0
  95. data/tasks/bench/null_listener.rb +4 -0
  96. data/tasks/compile.rake +89 -0
  97. data/tasks/cucumber.rake +26 -0
  98. data/tasks/gems.rake +45 -0
  99. data/tasks/ikvm.rake +47 -0
  100. data/tasks/ragel_task.rb +70 -0
  101. data/tasks/rdoc.rake +12 -0
  102. data/tasks/release.rake +26 -0
  103. data/tasks/rspec.rake +15 -0
  104. metadata +257 -0
@@ -0,0 +1,144 @@
1
+ #encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ module Gherkin
5
+ module Lexer
6
+ describe I18n do
7
+ before do
8
+ @listener = Gherkin::SexpRecorder.new
9
+ end
10
+
11
+ def scan_file(lexer, file)
12
+ lexer.scan(File.new(File.dirname(__FILE__) + "/fixtures/" + file).read)
13
+ end
14
+
15
+ it "should recognize keywords in the language of the lexer" do
16
+ lexer = Gherkin::I18nLexer.new(@listener, false)
17
+ scan_file(lexer, "i18n_no.feature")
18
+ @listener.to_sexp.should == [
19
+ [:comment, "#language:no", 1],
20
+ [:feature, "Egenskap", "i18n support", 2],
21
+ [:scenario, "Scenario", "Parsing many languages", 4],
22
+ [:step, "Gitt ", "Gherkin supports many languages", 5],
23
+ [:step, "Når ", "Norwegian keywords are parsed", 6],
24
+ [:step, "Så ", "they should be recognized", 7],
25
+ [:eof]
26
+ ]
27
+ end
28
+
29
+ it "should parse languages without a space after keywords" do
30
+ lexer = Gherkin::I18nLexer.new(@listener, false)
31
+ scan_file(lexer, "i18n_zh-CN.feature")
32
+ @listener.to_sexp.should == [
33
+ [:comment, "#language:zh-CN", 1],
34
+ [:feature, "功能", "加法", 2],
35
+ [:scenario, "场景", "两个数相加", 4],
36
+ [:step, "假如", "我已经在计算器里输入6", 5],
37
+ [:step, "而且", "我已经在计算器里输入7", 6],
38
+ [:step, "当", "我按相加按钮", 7],
39
+ [:step, "那么", "我应该在屏幕上看到的结果是13", 8],
40
+ [:eof]
41
+ ]
42
+ end
43
+
44
+ it "should parse languages with spaces after some keywords but not others" do
45
+ lexer = Gherkin::I18nLexer.new(@listener, false)
46
+ scan_file(lexer, "i18n_fr.feature")
47
+ @listener.to_sexp.should == [
48
+ [:comment, "#language:fr", 1],
49
+ [:feature, "Fonctionnalité", "Addition", 2],
50
+ [:scenario_outline, "Plan du scénario", "Addition de produits dérivés", 3],
51
+ [:step, "Soit ", "une calculatrice", 4],
52
+ [:step, "Etant donné ", "qu'on tape <a>", 5],
53
+ [:step, "Et ", "qu'on tape <b>", 6],
54
+ [:step, "Lorsqu'", "on tape additionner", 7],
55
+ [:step, "Alors ", "le résultat doit être <somme>", 8],
56
+ [:examples, "Exemples", "", 10],
57
+ [:row, %w{a b somme}, 11],
58
+ [:row, %w{2 2 4}, 12],
59
+ [:row, %w{2 3 5}, 13],
60
+ [:eof]
61
+ ]
62
+ end
63
+
64
+ describe 'keywords' do
65
+ it "should have code keywords without space, comma or apostrophe" do
66
+ ['Akkor', 'Etantdonné', 'Lorsque', '假設'].each do |code_keyword|
67
+ Gherkin::I18n.code_keywords.should include(code_keyword)
68
+ end
69
+ end
70
+
71
+ unless defined?(JRUBY_VERSION)
72
+ it "should print available languages" do
73
+ ("\n" + Gherkin::I18n.language_table).should == %{
74
+ | ar | Arabic | العربية |
75
+ | bg | Bulgarian | български |
76
+ | ca | Catalan | català |
77
+ | cs | Czech | Česky |
78
+ | cy-GB | Welsh | Cymraeg |
79
+ | da | Danish | dansk |
80
+ | de | German | Deutsch |
81
+ | en | English | English |
82
+ | en-Scouse | Scouse | Scouse |
83
+ | en-au | Australian | Australian |
84
+ | en-lol | LOLCAT | LOLCAT |
85
+ | en-tx | Texan | Texan |
86
+ | eo | Esperanto | Esperanto |
87
+ | es | Spanish | español |
88
+ | et | Estonian | eesti keel |
89
+ | fi | Finnish | suomi |
90
+ | fr | French | français |
91
+ | he | Hebrew | עברית |
92
+ | hr | Croatian | hrvatski |
93
+ | hu | Hungarian | magyar |
94
+ | id | Indonesian | Bahasa Indonesia |
95
+ | it | Italian | italiano |
96
+ | ja | Japanese | 日本語 |
97
+ | ko | Korean | 한국어 |
98
+ | lt | Lithuanian | lietuvių kalba |
99
+ | lu | Luxemburgish | Lëtzebuergesch |
100
+ | lv | Latvian | latviešu |
101
+ | nl | Dutch | Nederlands |
102
+ | no | Norwegian | norsk |
103
+ | pl | Polish | polski |
104
+ | pt | Portuguese | português |
105
+ | ro | Romanian | română |
106
+ | ro-RO | Romanian (diacritical) | română (diacritical) |
107
+ | ru | Russian | русский |
108
+ | sk | Slovak | Slovensky |
109
+ | sr-Cyrl | Serbian | Српски |
110
+ | sr-Latn | Serbian (Latin) | Srpski (Latinica) |
111
+ | sv | Swedish | Svenska |
112
+ | tr | Turkish | Türkçe |
113
+ | uk | Ukrainian | Українська |
114
+ | uz | Uzbek | Узбекча |
115
+ | vi | Vietnamese | Tiếng Việt |
116
+ | zh-CN | Chinese simplified | 简体中文 |
117
+ | zh-TW | Chinese traditional | 繁體中文 |
118
+ }
119
+ end
120
+ end
121
+
122
+ it "should print keywords for a given language" do
123
+ ("\n" + Gherkin::I18n.get('fr').keyword_table).should == %{
124
+ | feature | "Fonctionnalité" |
125
+ | background | "Contexte" |
126
+ | scenario | "Scénario" |
127
+ | scenario_outline | "Plan du scénario", "Plan du Scénario" |
128
+ | examples | "Exemples" |
129
+ | given | "* ", "Soit ", "Etant donné " |
130
+ | when | "* ", "Quand ", "Lorsque ", "Lorsqu'" |
131
+ | then | "* ", "Alors " |
132
+ | and | "* ", "Et " |
133
+ | but | "* ", "Mais " |
134
+ | given (code) | "Soit", "Etantdonné" |
135
+ | when (code) | "Quand", "Lorsque", "Lorsqu" |
136
+ | then (code) | "Alors" |
137
+ | and (code) | "Et" |
138
+ | but (code) | "Mais" |
139
+ }
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,21 @@
1
+ #encoding: utf-8
2
+ if defined?(JRUBY_VERSION)
3
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
4
+ require 'gherkin.jar'
5
+
6
+ module Gherkin
7
+ module JavaLexer
8
+ describe "Java Lexer" do
9
+ before do
10
+ @listener = Gherkin::SexpRecorder.new
11
+ @lexer = Java::Gherkin::I18nLexer.new(@listener)
12
+ end
13
+
14
+ it_should_behave_like "a Gherkin lexer"
15
+ it_should_behave_like "a Gherkin lexer lexing tags"
16
+ it_should_behave_like "a Gherkin lexer lexing py_strings"
17
+ it_should_behave_like "a Gherkin lexer lexing rows"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,390 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
+ require 'gherkin/parser/filter_listener'
4
+ require 'gherkin/formatter/pretty_formatter'
5
+ require 'stringio'
6
+
7
+ module Gherkin
8
+ module Parser
9
+ describe FilterListener do
10
+
11
+ class LineListener
12
+ attr_reader :lines
13
+
14
+ def method_missing(*sexp_args)
15
+ @lines ||= []
16
+ @lines << sexp_args[-1]
17
+ end
18
+ end
19
+
20
+ def verify_filters(expected_lines, filters)
21
+ line_listener = LineListener.new
22
+ scan(line_listener, filters)
23
+ line_listener.lines.should == expected_lines
24
+ end
25
+
26
+ def verify_output(expected_output, filters)
27
+ io = StringIO.new
28
+ scan(Gherkin::Formatter::PrettyFormatter.new(io, true), filters)
29
+ io.rewind
30
+ io.read.should == expected_output
31
+ end
32
+
33
+ def scan(listener, filters)
34
+ filter_listener = FilterListener.new(listener, filters)
35
+ parser = Gherkin::Parser::Parser.new(filter_listener, true, "root")
36
+ lexer = Gherkin::I18nLexer.new(parser, true)
37
+ lexer.scan(@input)
38
+ end
39
+
40
+ context "Scenario" do
41
+ before do
42
+ @input = %{Feature: 1
43
+ Scenario: 2
44
+ Given 3
45
+
46
+ Scenario: 5
47
+ Given 6
48
+ }
49
+ end
50
+
51
+ it "should not replay anything if no lines match" do
52
+ verify_filters([:eof], [90])
53
+ end
54
+
55
+ it "should not replay anything if no names match" do
56
+ verify_filters([:eof], [/pudding/])
57
+ end
58
+
59
+ it "should replay identically when there is no filter" do
60
+ verify_filters([1,2,3,5,6,:eof], [])
61
+ end
62
+
63
+ it "should replay identically when line filter is feature line" do
64
+ verify_filters([1,2,3,5,6,:eof], [1])
65
+ end
66
+
67
+ it "should match scenario line of first scenario" do
68
+ verify_filters([1,2,3,:eof], [2])
69
+ end
70
+
71
+ it "should match name of first scenario" do
72
+ verify_filters([1,2,3,:eof], [/2/])
73
+ end
74
+
75
+ it "should match step line of first scenario" do
76
+ verify_filters([1,2,3,:eof], [3])
77
+ end
78
+
79
+ it "should match step line of second scenario" do
80
+ verify_filters([1,5,6,:eof], [6])
81
+ end
82
+
83
+ it "should replay identically (except newlines) when the filter matches both scenarios" do
84
+ verify_filters([1,2,3,5,6,:eof], [3,6])
85
+ end
86
+ end
87
+
88
+ context "Scenario with py_string" do
89
+ before do
90
+ @input = %{Feature: 1
91
+ Scenario: 2
92
+ Given 3
93
+ """
94
+ 5
95
+ """
96
+
97
+ Scenario: 8
98
+ Given 9
99
+ }
100
+ end
101
+
102
+ it "should replay identically when there is no filter" do
103
+ verify_filters([1,2,3,4,8,9,:eof], {})
104
+ end
105
+
106
+ it "should filter on py_string line" do
107
+ verify_filters([1,2,3,4,:eof], [4])
108
+ end
109
+ end
110
+
111
+ context "Scenario with Table and Comment and Tag" do
112
+ before do
113
+ @input = %{#language:en
114
+ Feature: 2
115
+ # 3
116
+ Scenario: 4
117
+ Given 5
118
+ When 6
119
+
120
+ @tag8
121
+ Scenario: 9
122
+ Given 10
123
+ When 11
124
+ | 12 | 12 |
125
+ | 13 | 13 |
126
+ }
127
+ end
128
+
129
+ it "should replay identically when there is no filter" do
130
+ verify_filters([1,2,3,4,5,6,8,9,10,11,12,13,:eof], [])
131
+ end
132
+
133
+ it "should match step line of first scenario" do
134
+ verify_filters([1,2,3,4,5,6,:eof], [5])
135
+ end
136
+
137
+ it "should match scenario line of second scenario" do
138
+ verify_filters([1,2,8,9,10,11,12,13,:eof], [9])
139
+ end
140
+
141
+ it "should match tag of second scenario" do
142
+ verify_filters([1,2,8,9,10,11,12,13,:eof], ['@tag8'])
143
+ end
144
+
145
+ it "should return everything when a line is given in each scenario" do
146
+ verify_filters([1,2,3,4,5,6,8,9,10,11,12,13,:eof], [6,9])
147
+ end
148
+
149
+ it "should return a scenario when a line is given for its tag" do
150
+ verify_filters([1,2,8,9,10,11,12,13,:eof], [8])
151
+ end
152
+
153
+ it "should return a scenario when a line is given for its comment" do
154
+ verify_filters([1,2,3,4,5,6,:eof], [3])
155
+ end
156
+ end
157
+
158
+ context "Scenario with Background and Comment" do
159
+ before do
160
+ @input = %{#language:en
161
+ Feature: 2
162
+ # 3
163
+ Background: 4
164
+ Given 5
165
+
166
+ # 7
167
+ Scenario: 8
168
+ Given 9
169
+ When 10
170
+
171
+ Scenario: 12
172
+ Given 13
173
+ When 14
174
+ | 15 | 16 |
175
+ | 15 | 16 |
176
+ }
177
+ end
178
+
179
+ it "should replay identically when there is no filter" do
180
+ verify_filters([1,2,3,4,5,7,8,9,10,12,13,14,15,16,:eof], [])
181
+ end
182
+
183
+ it "should not replay any scenarios when filtering on the line of a background step" do
184
+ verify_filters([1,2,3,4,5,:eof], [5])
185
+ end
186
+
187
+ it "should not replay any scenarios when filtering on the line of the background" do
188
+ verify_filters([1,2,3,4,5,:eof], [4])
189
+ end
190
+
191
+ it "should replay the background on step line of first scenario" do
192
+ verify_filters([1,2,3,4,5,7,8,9,10,:eof], [9])
193
+ end
194
+ end
195
+
196
+ context "Scenario Outline" do
197
+ before do
198
+ @input = %{Feature: 1
199
+
200
+ @tag3
201
+ Scenario Outline: 4
202
+ Given <foo> 5
203
+ When <bar> 6
204
+
205
+ @tag8
206
+ Examples: 9
207
+ | foo | bar |
208
+ | 11 | 11 |
209
+ | 12 | 12 |
210
+ | 13 | 13 |
211
+ | 14 | 14 |
212
+ | 15 | 15 |
213
+
214
+ @tag17
215
+ Examples: 18
216
+ | snip | snap |
217
+ | 20 | 20 |
218
+ | 21 | 21 |
219
+
220
+ Scenario: 23
221
+ Given 24
222
+ When 25
223
+ }
224
+ end
225
+
226
+ it "should match step line of first scenario outline" do
227
+ verify_filters([1,3,4,5,6,8,9,10,11,12,13,14,15,17,18,19,20,21,:eof], [6])
228
+ end
229
+
230
+ it "should match examples line of second scenario outline" do
231
+ verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [18])
232
+ end
233
+
234
+ it "should match examples name of second scenario outline" do
235
+ verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [/18/])
236
+ end
237
+
238
+ it "should match header row line of second scenario outline" do
239
+ verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [19])
240
+ end
241
+
242
+ it "should match an example row of first scenario outline" do
243
+ verify_filters([1,3,4,5,6,8,9,10,13,:eof], [13])
244
+ end
245
+
246
+ it "should match an example row of second scenario outline" do
247
+ verify_filters([1,3,4,5,6,17,18,19,20,:eof], [20])
248
+ end
249
+
250
+ it "should match 2 example rows of first scenario outline" do
251
+ verify_filters([1,3,4,5,6,8,9,10,12,14,:eof], [12,14])
252
+ end
253
+
254
+ it "should replay itself properly" do
255
+ filtered = %{Feature: 1
256
+
257
+ @tag3
258
+ Scenario Outline: 4
259
+ Given <foo> 5
260
+ When <bar> 6
261
+
262
+ @tag8
263
+ Examples: 9
264
+ | foo | bar |
265
+ | 12 | 12 |
266
+ | 14 | 14 |
267
+ }
268
+
269
+ verify_output(filtered, [12,14])
270
+ end
271
+ end
272
+
273
+ context "Scenarios with tags on both feature and scenarios" do
274
+ before do
275
+ # Lines with more than one tag per line will be repeated
276
+ @input = %{#language:en
277
+ @a @b
278
+ Feature: 3
279
+ @c @d
280
+ Scenario: 5
281
+ Given 6
282
+
283
+ @c @e
284
+ Scenario: 9
285
+ Given 10
286
+
287
+ Scenario: 12
288
+ Given 13
289
+ }
290
+ end
291
+
292
+ it "should match @d" do
293
+ verify_filters([1,2,2,3,4,4,5,6,:eof], ['@d'])
294
+ end
295
+
296
+ it "should match everything when feature tag matches" do
297
+ verify_filters([1,2,2,3,4,4,5,6,8,8,9,10,12,13,:eof], ['@a'])
298
+ end
299
+
300
+ it "should match @a && !@d" do
301
+ verify_filters([1,2,2,3,8,8,9,10,12,13,:eof], ['@a','~@d'])
302
+ end
303
+
304
+ it "should match @d || @e" do
305
+ verify_filters([1,2,2,3,4,4,5,6,8,8,9,10,:eof], ['@d,@e'])
306
+ end
307
+ end
308
+
309
+ context "Scenario Outlines with tags on examples" do
310
+ before do
311
+ # Lines with more than one tag per line will be repeated
312
+ @input = %{#language:en
313
+ @a @b
314
+ Feature: 3
315
+ @d
316
+ Scenario Outline: 5
317
+ Given 6
318
+
319
+ @c @e
320
+ Examples: 9
321
+ | foo | bar |
322
+ | 11 | 11 |
323
+
324
+ @d @f
325
+ Examples: 14
326
+ | foo | bar |
327
+ | 16 | 16 |
328
+ | 17 | 17 |
329
+
330
+ Scenario: 19
331
+ Given 20
332
+ }
333
+ end
334
+
335
+ it "should match @c" do
336
+ verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,:eof], ['@c'])
337
+ end
338
+
339
+ it "should match @d" do
340
+ verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,13,13,14,15,16,17,:eof], ['@d'])
341
+ end
342
+
343
+ it "should match @f" do
344
+ verify_filters([1,2,2,3,4,5,6,13,13,14,15,16,17,:eof], ['@f'])
345
+ end
346
+
347
+ it "should match @a and not @c" do
348
+ verify_filters([1,2,2,3,4,5,6,13,13,14,15,16,17,19,20,:eof], ['@a','~@c'])
349
+ end
350
+
351
+ it "should match @c or @d" do
352
+ verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,13,13,14,15,16,17,:eof], ['@c,@d'])
353
+ end
354
+
355
+ it "should not match @m" do
356
+ verify_filters([:eof], ['@m'])
357
+ end
358
+ end
359
+
360
+ context "Background with PyString" do
361
+ before do
362
+ @input = %{#language:en
363
+ Feature: 2
364
+ Background: 3
365
+ Given 4
366
+ """
367
+ 6
368
+ """
369
+
370
+ Scenario: 9
371
+ Given 10
372
+ """
373
+ 12
374
+ """
375
+
376
+ Scenario: 15
377
+ Given 16
378
+ """
379
+ 18
380
+ """
381
+ }
382
+ end
383
+
384
+ it "should replay itself properly" do
385
+ verify_filters([1,2,3,4,5,15,16,17,:eof], [15])
386
+ end
387
+ end
388
+ end
389
+ end
390
+ end