bryanl-gherkin 2.11.1.1-java

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 (142) hide show
  1. data/.gitattributes +2 -0
  2. data/.mailmap +2 -0
  3. data/.rbenv-gemsets +1 -0
  4. data/.rspec +1 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +16 -0
  7. data/.yardopts +5 -0
  8. data/Gemfile +5 -0
  9. data/History.md +788 -0
  10. data/LICENSE +20 -0
  11. data/README.md +272 -0
  12. data/Rakefile +26 -0
  13. data/build_native_gems.sh +7 -0
  14. data/cucumber.yml +4 -0
  15. data/examples/parse_and_output_json.rb +19 -0
  16. data/features/.cucumber/stepdefs.json +244 -0
  17. data/features/escaped_pipes.feature +8 -0
  18. data/features/feature_parser.feature +237 -0
  19. data/features/json_formatter.feature +498 -0
  20. data/features/json_parser.feature +331 -0
  21. data/features/native_lexer.feature +19 -0
  22. data/features/parser_with_native_lexer.feature +205 -0
  23. data/features/pretty_formatter.feature +16 -0
  24. data/features/step_definitions/eyeball_steps.rb +3 -0
  25. data/features/step_definitions/gherkin_steps.rb +29 -0
  26. data/features/step_definitions/json_formatter_steps.rb +30 -0
  27. data/features/step_definitions/json_parser_steps.rb +20 -0
  28. data/features/step_definitions/pretty_formatter_steps.rb +85 -0
  29. data/features/steps_parser.feature +46 -0
  30. data/features/support/env.rb +42 -0
  31. data/gherkin.gemspec +77 -0
  32. data/install_mingw_os_x.sh +7 -0
  33. data/js/.npmignore +1 -0
  34. data/js/lib/gherkin/lexer/.npmignore +0 -0
  35. data/lib/gherkin/c_lexer.rb +17 -0
  36. data/lib/gherkin/formatter/ansi_escapes.rb +97 -0
  37. data/lib/gherkin/formatter/argument.rb +16 -0
  38. data/lib/gherkin/formatter/escaping.rb +15 -0
  39. data/lib/gherkin/formatter/filter_formatter.rb +146 -0
  40. data/lib/gherkin/formatter/hashable.rb +19 -0
  41. data/lib/gherkin/formatter/json_formatter.rb +122 -0
  42. data/lib/gherkin/formatter/line_filter.rb +26 -0
  43. data/lib/gherkin/formatter/model.rb +281 -0
  44. data/lib/gherkin/formatter/pretty_formatter.rb +244 -0
  45. data/lib/gherkin/formatter/regexp_filter.rb +21 -0
  46. data/lib/gherkin/formatter/step_printer.rb +21 -0
  47. data/lib/gherkin/formatter/tag_count_formatter.rb +47 -0
  48. data/lib/gherkin/formatter/tag_filter.rb +19 -0
  49. data/lib/gherkin/i18n.rb +180 -0
  50. data/lib/gherkin/i18n.yml +613 -0
  51. data/lib/gherkin/js_lexer.rb +20 -0
  52. data/lib/gherkin/json_parser.rb +177 -0
  53. data/lib/gherkin/lexer/i18n_lexer.rb +46 -0
  54. data/lib/gherkin/listener/event.rb +45 -0
  55. data/lib/gherkin/listener/formatter_listener.rb +143 -0
  56. data/lib/gherkin/native/java.rb +72 -0
  57. data/lib/gherkin/native/null.rb +5 -0
  58. data/lib/gherkin/native/therubyracer.rb +39 -0
  59. data/lib/gherkin/native.rb +7 -0
  60. data/lib/gherkin/parser/meta.txt +5 -0
  61. data/lib/gherkin/parser/parser.rb +164 -0
  62. data/lib/gherkin/parser/root.txt +11 -0
  63. data/lib/gherkin/parser/steps.txt +4 -0
  64. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  65. data/lib/gherkin/rb_lexer.rb +8 -0
  66. data/lib/gherkin/rubify.rb +24 -0
  67. data/lib/gherkin/tag_expression.rb +62 -0
  68. data/lib/gherkin.jar +0 -0
  69. data/lib/gherkin.rb +2 -0
  70. data/ragel/lexer.c.rl.erb +454 -0
  71. data/ragel/lexer.java.rl.erb +219 -0
  72. data/ragel/lexer.js.rl.erb +227 -0
  73. data/ragel/lexer.rb.rl.erb +174 -0
  74. data/ragel/lexer_common.rl.erb +50 -0
  75. data/spec/gherkin/c_lexer_spec.rb +22 -0
  76. data/spec/gherkin/fixtures/1.feature +8 -0
  77. data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
  78. data/spec/gherkin/fixtures/complex.feature +45 -0
  79. data/spec/gherkin/fixtures/complex.json +139 -0
  80. data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
  81. data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
  82. data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
  83. data/spec/gherkin/fixtures/examples_with_only_header.feature +14 -0
  84. data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
  85. data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
  86. data/spec/gherkin/fixtures/i18n_fr2.feature +8 -0
  87. data/spec/gherkin/fixtures/i18n_no.feature +7 -0
  88. data/spec/gherkin/fixtures/i18n_pt1.feature +44 -0
  89. data/spec/gherkin/fixtures/i18n_pt2.feature +4 -0
  90. data/spec/gherkin/fixtures/i18n_pt3.feature +4 -0
  91. data/spec/gherkin/fixtures/i18n_pt4.feature +4 -0
  92. data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
  93. data/spec/gherkin/fixtures/issue_145.feature +22 -0
  94. data/spec/gherkin/fixtures/scenario_outline_with_tags.feature +13 -0
  95. data/spec/gherkin/fixtures/scenario_without_steps.feature +5 -0
  96. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  97. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  98. data/spec/gherkin/fixtures/with_bom.feature +3 -0
  99. data/spec/gherkin/formatter/ansi_escapes_spec.rb +32 -0
  100. data/spec/gherkin/formatter/filter_formatter_spec.rb +204 -0
  101. data/spec/gherkin/formatter/json_formatter_spec.rb +92 -0
  102. data/spec/gherkin/formatter/model_spec.rb +28 -0
  103. data/spec/gherkin/formatter/pretty_formatter_spec.rb +177 -0
  104. data/spec/gherkin/formatter/spaces.feature +9 -0
  105. data/spec/gherkin/formatter/step_printer_spec.rb +55 -0
  106. data/spec/gherkin/formatter/tabs.feature +9 -0
  107. data/spec/gherkin/formatter/tag_count_formatter_spec.rb +30 -0
  108. data/spec/gherkin/i18n_spec.rb +241 -0
  109. data/spec/gherkin/java_lexer_spec.rb +20 -0
  110. data/spec/gherkin/js_lexer_spec.rb +23 -0
  111. data/spec/gherkin/json_parser_spec.rb +176 -0
  112. data/spec/gherkin/lexer/i18n_lexer_spec.rb +43 -0
  113. data/spec/gherkin/output_stream_string_io.rb +20 -0
  114. data/spec/gherkin/parser/parser_spec.rb +16 -0
  115. data/spec/gherkin/rb_lexer_spec.rb +20 -0
  116. data/spec/gherkin/sexp_recorder.rb +59 -0
  117. data/spec/gherkin/shared/bom_group.rb +20 -0
  118. data/spec/gherkin/shared/doc_string_group.rb +163 -0
  119. data/spec/gherkin/shared/lexer_group.rb +591 -0
  120. data/spec/gherkin/shared/row_group.rb +125 -0
  121. data/spec/gherkin/shared/tags_group.rb +54 -0
  122. data/spec/gherkin/tag_expression_spec.rb +142 -0
  123. data/spec/spec_helper.rb +75 -0
  124. data/tasks/bench/feature_builder.rb +49 -0
  125. data/tasks/bench/null_listener.rb +4 -0
  126. data/tasks/bench.rake +184 -0
  127. data/tasks/compile.rake +120 -0
  128. data/tasks/cucumber.rake +22 -0
  129. data/tasks/gems.rake +31 -0
  130. data/tasks/ikvm.rake +124 -0
  131. data/tasks/ragel_task.rb +100 -0
  132. data/tasks/release.rake +49 -0
  133. data/tasks/rspec.rake +8 -0
  134. data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  135. data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
  136. data/tasks/yard/default/layout/html/footer.erb +5 -0
  137. data/tasks/yard/default/layout/html/index.erb +1 -0
  138. data/tasks/yard/default/layout/html/layout.erb +25 -0
  139. data/tasks/yard/default/layout/html/logo.erb +1 -0
  140. data/tasks/yard/default/layout/html/setup.rb +4 -0
  141. data/tasks/yard.rake +7 -0
  142. metadata +412 -0
@@ -0,0 +1,241 @@
1
+ #encoding: utf-8
2
+ require '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::Lexer::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 recognize keywords that are a little ambiguous" do
30
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
31
+ scan_file(lexer, "i18n_fr2.feature")
32
+ @listener.to_sexp.should == [
33
+ [:comment, "#language:fr", 1],
34
+ [:feature, "Fonctionnalité", "i18n", "", 2],
35
+ [:scenario, "Scénario", "Le French", "", 4],
36
+ [:step, "Etant donné ", "qqch", 5],
37
+ [:step, "Etant donnée ", "qqch", 6],
38
+ [:step, "Etant donnés ", "qqch", 7],
39
+ [:step, "Etant données ", "qqch", 8],
40
+ [:eof]
41
+ ]
42
+ end
43
+
44
+ it "should parse languages without a space after keywords" do
45
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
46
+ scan_file(lexer, "i18n_zh-CN.feature")
47
+ @listener.to_sexp.should == [
48
+ [:comment, "#language:zh-CN", 1],
49
+ [:feature, "功能", "加法", "", 2],
50
+ [:scenario, "场景", "两个数相加", "", 4],
51
+ [:step, "假如", "我已经在计算器里输入6", 5],
52
+ [:step, "而且", "我已经在计算器里输入7", 6],
53
+ [:step, "当", "我按相加按钮", 7],
54
+ [:step, "那么", "我应该在屏幕上看到的结果是13", 8],
55
+ [:eof]
56
+ ]
57
+ end
58
+
59
+ it "should parse languages with spaces after some keywords but not others" do
60
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
61
+ scan_file(lexer, "i18n_fr.feature")
62
+ @listener.to_sexp.should == [
63
+ [:comment, "#language:fr", 1],
64
+ [:feature, "Fonctionnalité", "Addition", "", 2],
65
+ [:scenario_outline, "Plan du scénario", "Addition de produits dérivés", "", 3],
66
+ [:step, "Soit ", "une calculatrice", 4],
67
+ [:step, "Etant donné ", "qu'on tape <a>", 5],
68
+ [:step, "Et ", "qu'on tape <b>", 6],
69
+ [:step, "Lorsqu'", "on tape additionner", 7],
70
+ [:step, "Alors ", "le résultat doit être <somme>", 8],
71
+ [:examples, "Exemples", "", "", 10],
72
+ [:row, %w{a b somme}, 11],
73
+ [:row, %w{2 2 4}, 12],
74
+ [:row, %w{2 3 5}, 13],
75
+ [:eof]
76
+ ]
77
+ end
78
+
79
+ it "should recognize keywords in Portuguese (1st variant)" do
80
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
81
+ scan_file(lexer, "i18n_pt1.feature")
82
+ @listener.to_sexp.should == [
83
+ [:comment, "# language: pt", 1],
84
+ [:feature, "Funcionalidade", "Reconhece \"Funcionalidade\"", "", 2],
85
+ [:background, "Contexto", "Reconhece \"Contexto\"", "", 4],
86
+ [:scenario, "Cenário", "Reconhece \"Cenário\" com acento", "", 6],
87
+ [:scenario, "Cenario", "Reconhece \"Cenário\" sem acento", "", 8],
88
+ [:scenario_outline, "Esquema do Cenário", "Reconhece \"Esquema do Cenário\" com acento", "", 10],
89
+ [:step, "Dado ", "que <Valor> é um valor e que reconhece \"Dado\";", 11],
90
+ [:step, "Dada ", "a afirmação de que reconhece \"Dada\";", 12],
91
+ [:step, "Dados ", "os factos acima e ainda que reconhece \"Dados\";", 13],
92
+ [:step, "Dadas ", "as afirmações acima e ainda que reconhece \"Dadas\";", 14],
93
+ [:step, "Quando ", "reconhece \"Quando\";", 15],
94
+ [:step, "Então ", "também reconhece \"Então\" com acento e", 16],
95
+ [:step, "Entao ", "também reconhece \"Então\" sem acento;", 17],
96
+ [:step, "E ", "reconhece \"E\";", 18],
97
+ [:step, "Mas ", "também reconhece \"Mas\".", 19],
98
+ [:examples, "Exemplos", "Reconhece \"Exemplos\"", "", 21],
99
+ [:row, ["Valor"], 22],
100
+ [:row, ["1"], 23],
101
+ [:scenario_outline, "Esquema do Cenario", "Reconhece \"Esquema do Cenário\" sem acento", "", 25],
102
+ [:step, "Dado ", "que <Valor> é um valor;", 26],
103
+ [:examples, "Cenários", "Reconhece \"Cenários\" com acento", "", 28],
104
+ [:row, ["Valor"], 29],
105
+ [:row, ["1"], 30],
106
+ [:scenario_outline, "Delineação do Cenário", "Reconhece \"Delineação do Cenário\" com acento", "", 32],
107
+ [:step, "Dado ", "que <Valor> é um valor;", 33],
108
+ [:examples, "Cenarios", "Reconhece \"Cenários\" sem acento", "", 35],
109
+ [:row, ["Valor"], 36],
110
+ [:row, ["1"], 37],
111
+ [:scenario_outline, "Delineacao do Cenario", "Reconhece \"Delineação do Cenário\" sem acento", "", 39],
112
+ [:step, "Dado ", "que <Valor> é um valor;", 40],
113
+ [:examples, "Exemplos", "Reconhece \"Exemplos\"", "", 42],
114
+ [:row, ["Valor"], 43],
115
+ [:row, ["1"], 44],
116
+ [:eof]
117
+ ]
118
+ end
119
+
120
+ it "should recognize keywords in Portuguese (2nd variant)" do
121
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
122
+ scan_file(lexer, "i18n_pt2.feature")
123
+ @listener.to_sexp.should == [
124
+ [:comment, "# language: pt", 1],
125
+ [:feature, "Característica", "Reconhece \"Característica\" com acento", "", 2],
126
+ [:background, "Cenário de Fundo", "Reconhece \"Cenário de Fundo\" com acento", "", 4],
127
+ [:eof]
128
+ ]
129
+ end
130
+
131
+ it "should recognize keywords in Portuguese (3rd variant)" do
132
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
133
+ scan_file(lexer, "i18n_pt3.feature")
134
+ @listener.to_sexp.should == [
135
+ [:comment, "# language: pt", 1],
136
+ [:feature, "Caracteristica", "Reconhece \"Característica\" sem acento", "", 2],
137
+ [:background, "Cenario de Fundo", "Reconhece \"Cenário de Fundo\" sem acento", "", 4],
138
+ [:eof]
139
+ ]
140
+ end
141
+
142
+ it "should recognize keywords in Portuguese (4th variant)" do
143
+ lexer = Gherkin::Lexer::I18nLexer.new(@listener, false)
144
+ scan_file(lexer, "i18n_pt4.feature")
145
+ @listener.to_sexp.should == [
146
+ [:comment, "# language: pt", 1],
147
+ [:feature, "Característica", "Reconhece \"Característica\" com acento", "", 2],
148
+ [:background, "Fundo", "Reconhece \"Fundo\"", "", 4],
149
+ [:eof]
150
+ ]
151
+ end
152
+
153
+ describe 'keywords' do
154
+ it "should have code keywords without space, comma, exclamation or apostrophe" do
155
+ ['Avast', 'Akkor', 'Etantdonné', 'Lorsque', '假設'].each do |code_keyword|
156
+ Gherkin::I18n.code_keywords.should include(code_keyword)
157
+ end
158
+ end
159
+
160
+ it "should reject the bullet stars" do
161
+ Gherkin::I18n.code_keywords.should_not include('*')
162
+ end
163
+
164
+ it "should report keyword regexp" do
165
+ Gherkin::I18n.keyword_regexp(:step).should =~ /\|Quando \|Quand \|Quan \|Pryd \|Pokud \|/
166
+ end
167
+
168
+ it "should print available languages" do
169
+ ("\n" + Gherkin::I18n.language_table).should == %{
170
+ | ar | Arabic | العربية |
171
+ | bg | Bulgarian | български |
172
+ | bm | Malay | Bahasa Melayu |
173
+ | ca | Catalan | català |
174
+ | cs | Czech | Česky |
175
+ | cy-GB | Welsh | Cymraeg |
176
+ | da | Danish | dansk |
177
+ | de | German | Deutsch |
178
+ | en | English | English |
179
+ | en-Scouse | Scouse | Scouse |
180
+ | en-au | Australian | Australian |
181
+ | en-lol | LOLCAT | LOLCAT |
182
+ | en-pirate | Pirate | Pirate |
183
+ | en-tx | Texan | Texan |
184
+ | eo | Esperanto | Esperanto |
185
+ | es | Spanish | español |
186
+ | et | Estonian | eesti keel |
187
+ | fi | Finnish | suomi |
188
+ | fr | French | français |
189
+ | he | Hebrew | עברית |
190
+ | hr | Croatian | hrvatski |
191
+ | hu | Hungarian | magyar |
192
+ | id | Indonesian | Bahasa Indonesia |
193
+ | is | Icelandic | Íslenska |
194
+ | it | Italian | italiano |
195
+ | ja | Japanese | 日本語 |
196
+ | ko | Korean | 한국어 |
197
+ | lt | Lithuanian | lietuvių kalba |
198
+ | lu | Luxemburgish | Lëtzebuergesch |
199
+ | lv | Latvian | latviešu |
200
+ | nl | Dutch | Nederlands |
201
+ | no | Norwegian | norsk |
202
+ | pl | Polish | polski |
203
+ | pt | Portuguese | português |
204
+ | ro | Romanian | română |
205
+ | ru | Russian | русский |
206
+ | sk | Slovak | Slovensky |
207
+ | sr-Cyrl | Serbian | Српски |
208
+ | sr-Latn | Serbian (Latin) | Srpski (Latinica) |
209
+ | sv | Swedish | Svenska |
210
+ | tr | Turkish | Türkçe |
211
+ | uk | Ukrainian | Українська |
212
+ | uz | Uzbek | Узбекча |
213
+ | vi | Vietnamese | Tiếng Việt |
214
+ | zh-CN | Chinese simplified | 简体中文 |
215
+ | zh-TW | Chinese traditional | 繁體中文 |
216
+ }
217
+ end
218
+
219
+ it "should print keywords for a given language" do
220
+ ("\n" + Gherkin::I18n.get('fr').keyword_table).should == %{
221
+ | feature | "Fonctionnalité" |
222
+ | background | "Contexte" |
223
+ | scenario | "Scénario" |
224
+ | scenario_outline | "Plan du scénario", "Plan du Scénario" |
225
+ | examples | "Exemples" |
226
+ | given | "* ", "Soit ", "Etant donné ", "Etant donnée ", "Etant donnés ", "Etant données ", "Étant donné ", "Étant donnée ", "Étant donnés ", "Étant données " |
227
+ | when | "* ", "Quand ", "Lorsque ", "Lorsqu'" |
228
+ | then | "* ", "Alors " |
229
+ | and | "* ", "Et " |
230
+ | but | "* ", "Mais " |
231
+ | given (code) | "Soit", "Etantdonné", "Etantdonnée", "Etantdonnés", "Etantdonnées", "Étantdonné", "Étantdonnée", "Étantdonnés", "Étantdonnées" |
232
+ | when (code) | "Quand", "Lorsque", "Lorsqu" |
233
+ | then (code) | "Alors" |
234
+ | and (code) | "Et" |
235
+ | but (code) | "Mais" |
236
+ }
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,20 @@
1
+ #encoding: utf-8
2
+ if defined?(JRUBY_VERSION)
3
+ require 'spec_helper'
4
+
5
+ module Gherkin
6
+ module JavaLexer
7
+ describe "Java Lexer" do
8
+ before do
9
+ @listener = Gherkin::SexpRecorder.new
10
+ @lexer = Java::GherkinLexer::I18nLexer.new(@listener)
11
+ end
12
+
13
+ it_should_behave_like "a Gherkin lexer"
14
+ it_should_behave_like "a Gherkin lexer lexing tags"
15
+ it_should_behave_like "a Gherkin lexer lexing doc_strings"
16
+ it_should_behave_like "a Gherkin lexer lexing rows"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ #encoding: utf-8
2
+ if !defined?(JRUBY_VERSION) && ENV['GHERKIN_JS']
3
+ require 'spec_helper'
4
+ require 'gherkin/js_lexer'
5
+
6
+ module Gherkin
7
+ module Lexer
8
+ describe "JavaScript Lexer" do
9
+ before do
10
+ @listener = Gherkin::SexpRecorder.new
11
+ @lexer = Gherkin::JsLexer['en'].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 doc_strings"
17
+ it_should_behave_like "a Gherkin lexer lexing rows"
18
+ # TODO - make this pass!
19
+ # it_should_behave_like "parsing windows files"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,176 @@
1
+ #encoding: utf-8
2
+ require 'stringio'
3
+ require 'spec_helper'
4
+ require 'gherkin/json_parser'
5
+ require 'gherkin/formatter/json_formatter'
6
+
7
+ module Gherkin
8
+ describe JSONParser do
9
+
10
+ def check_json(json)
11
+ io = StringIO.new
12
+ f = Formatter::JSONFormatter.new(io)
13
+ p = JSONParser.new(f, f)
14
+ p.parse(json)
15
+ f.done
16
+ expected = JSON.parse(json)
17
+ actual = JSON.parse(io.string)
18
+
19
+ begin
20
+ actual.should == expected
21
+ rescue
22
+ puts "EXPECTED"
23
+ puts json
24
+ puts "ACTUAL"
25
+ puts io.string
26
+ puts "======"
27
+
28
+ raise
29
+ end
30
+ end
31
+
32
+ it "should parse a barely empty feature" do
33
+ check_json(%{[
34
+ {
35
+ "id": "one",
36
+ "uri": "test.feature",
37
+ "keyword": "Feature",
38
+ "name": "One",
39
+ "description": "",
40
+ "line" : 3
41
+ }
42
+ ]})
43
+ end
44
+
45
+ it "should parse feature with tags and one scenario" do
46
+ check_json(%{[
47
+ {
48
+ "id": "one",
49
+ "uri": "test.feature",
50
+ "tags": [
51
+ {
52
+ "name": "@foo",
53
+ "line": 22
54
+ }
55
+ ],
56
+ "keyword": "Feature",
57
+ "name": "One",
58
+ "description": "",
59
+ "line": 3,
60
+ "elements": [
61
+ {
62
+ "id": "one/two",
63
+ "type": "scenario",
64
+ "steps": [
65
+ {
66
+ "name": "Hello",
67
+ "rows": [
68
+ {
69
+ "cells": ["foo", "bar"]
70
+ }
71
+ ]
72
+ }
73
+ ]
74
+ }
75
+ ]
76
+ }
77
+ ]})
78
+ end
79
+
80
+ it "should parse feature with match, result and embedding" do
81
+ check_json(%{
82
+ [
83
+ {
84
+ "id":"one",
85
+ "uri":"test.feature",
86
+ "tags":[
87
+ {
88
+ "name":"@foo",
89
+ "line":22
90
+ }
91
+ ],
92
+ "keyword":"Feature",
93
+ "name":"One",
94
+ "description":"",
95
+ "line":3,
96
+ "elements":[
97
+ {
98
+ "id":"one/a-scenario",
99
+ "type":"scenario",
100
+ "before": [
101
+ {
102
+ "match":{
103
+ "location":"features/step_definitions/hooks.rb:1"
104
+ },
105
+ "result":{
106
+ "status":"passed",
107
+ "error_message":"Passed hook",
108
+ "duration": 3
109
+ }
110
+ },
111
+ {
112
+ "match":{
113
+ "location":"features/step_definitions/hooks.rb:2"
114
+ },
115
+ "result":{
116
+ "status":"failed",
117
+ "error_message":"Failed hook",
118
+ "duration": 22
119
+ }
120
+ }
121
+ ],
122
+ "steps":[
123
+ {
124
+ "keyword":"Given ",
125
+ "name":"a passing step",
126
+ "line":6,
127
+ "match":{
128
+ "arguments":[
129
+ {
130
+ "offset":22,
131
+ "val":"cukes"
132
+ }
133
+ ],
134
+ "location":"features/step_definitions/steps.rb:1"
135
+ },
136
+ "result":{
137
+ "status":"failed",
138
+ "error_message":"You suck",
139
+ "duration":-1
140
+ },
141
+ "embeddings":[
142
+ {
143
+ "mime_type":"text/plain",
144
+ "data":"Tm8sIEknbSBub3QgaW50ZXJlc3RlZCBpbiBkZXZlbG9waW5nIGEgcG93ZXJmdWwgYnJhaW4uIEFsbCBJJ20gYWZ0ZXIgaXMganVzdCBhIG1lZGlvY3JlIGJyYWluLCBzb21ldGhpbmcgbGlrZSB0aGUgUHJlc2lkZW50IG9mIHRoZSBBbWVyaWNhbiBUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55Lg=="
145
+ }
146
+ ],
147
+ "output":[
148
+ "Hello",
149
+ "World"
150
+ ]
151
+ }
152
+ ],
153
+ "after": [
154
+ {
155
+ "match":{
156
+ "location":"features/step_definitions/hooks.rb:3"
157
+ },
158
+ "result":{
159
+ "status":"failed",
160
+ "error_message":"Failed After",
161
+ "duration": 22
162
+ }
163
+ }
164
+ ]
165
+ }
166
+ ]
167
+ }
168
+ ]
169
+ })
170
+ end
171
+
172
+ it "shoud parse a complex feature" do
173
+ check_json('[' + fixture("complex.json") + ']')
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,43 @@
1
+ #encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module Gherkin
5
+ module Lexer
6
+ describe I18nLexer do
7
+ before do
8
+ @lexer = Gherkin::Lexer::I18nLexer.new(Gherkin::SexpRecorder.new, false)
9
+ end
10
+
11
+ it "should store the i18n language of the last scanned feature" do
12
+ @lexer.scan("# language: fr\n")
13
+ @lexer.i18n_language.iso_code.should == "fr"
14
+ @lexer.scan("# language: no\n")
15
+ @lexer.i18n_language.iso_code.should == "no"
16
+ end
17
+
18
+ it "should detect language when there are spaces and CRLF" do
19
+ @lexer.scan("# language: da \r\n")
20
+ @lexer.i18n_language.iso_code.should == "da"
21
+ end
22
+
23
+ it "should detect language when the language comment is not the first line" do
24
+ @lexer.scan("# hello\n# language: no\n")
25
+ @lexer.i18n_language.iso_code.should == "no"
26
+ end
27
+
28
+ it "should detect language when the language is on the third line, and there are empty lines above" do
29
+ @lexer.scan("# hello\n\n# language: no\n")
30
+ @lexer.i18n_language.iso_code.should == "no"
31
+ end
32
+
33
+ it "should use English i18n by default" do
34
+ @lexer.scan("Feature: foo\n")
35
+ @lexer.i18n_language.iso_code.should == "en"
36
+ end
37
+
38
+ it "should === its ruby class, even when the impl is Java" do
39
+ Gherkin::Lexer::I18nLexer.should === Gherkin::Lexer::I18nLexer.new(Gherkin::SexpRecorder.new, true)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ if defined?(JRUBY_VERSION)
2
+ class WriterStringIO < Java.java.io.StringWriter
3
+ def write(what)
4
+ super(Java.java.lang.String.new(what.to_s))
5
+ end
6
+
7
+ def string
8
+ toString()
9
+ end
10
+ end
11
+
12
+ require 'stringio'
13
+ class StringIO
14
+ class << self
15
+ def new
16
+ WriterStringIO.new
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module Gherkin
4
+ module Parser
5
+ describe Parser do
6
+ unless defined?(JRUBY_VERSION)
7
+ it "should raise when feature doesn't parse" do
8
+ p = Parser.new(mock('formatter').as_null_object)
9
+ lambda do
10
+ p.parse("Feature: f\nFeature: f", __FILE__, __LINE__-1)
11
+ end.should raise_error(/Parse error at/)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ #encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'gherkin/rb_lexer/en'
4
+
5
+ module Gherkin
6
+ module Lexer
7
+ describe "Ruby Lexer" do
8
+ before do
9
+ @listener = Gherkin::SexpRecorder.new
10
+ @lexer = Gherkin::RbLexer::En.new(@listener)
11
+ end
12
+
13
+ it_should_behave_like "a Gherkin lexer"
14
+ it_should_behave_like "a Gherkin lexer lexing tags"
15
+ it_should_behave_like "a Gherkin lexer lexing doc_strings"
16
+ it_should_behave_like "a Gherkin lexer lexing rows"
17
+ it_should_behave_like "parsing windows files"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,59 @@
1
+ require 'gherkin/rubify'
2
+ require 'gherkin/formatter/model'
3
+
4
+ module Gherkin
5
+ class SexpRecorder
6
+ include Rubify
7
+
8
+ def initialize
9
+ @sexps = []
10
+ end
11
+
12
+ # We can't use method_missing - therubyracer isn't able to invoke methods like that.
13
+ [:comment, :tag, :feature, :background, :scenario, :scenario_outline, :examples, :step, :doc_string, :row, :eof, :uri, :syntax_error].each do |event|
14
+ define_method(event) do |*args|
15
+ args = rubify(args)
16
+ args = sexpify(args)
17
+ @sexps << [event] + args
18
+ end
19
+ end
20
+
21
+ def to_sexp
22
+ @sexps
23
+ end
24
+
25
+ # Useful in IRB
26
+ def reset!
27
+ @sexps = []
28
+ end
29
+
30
+ def errors
31
+ @sexps.select { |sexp| sexp[0] == :syntax_error }
32
+ end
33
+
34
+ def line(number)
35
+ @sexps.find { |sexp| sexp.last == number }
36
+ end
37
+
38
+ def sexpify(o)
39
+ array = (defined?(JRUBY_VERSION) && Java.java.util.Collection === o) ||
40
+ (defined?(V8) && V8::Array === o) ||
41
+ Array === o
42
+ if array
43
+ o.map{|e| sexpify(e)}
44
+ elsif(Formatter::Model::Row === o)
45
+ {
46
+ "cells" => sexpify(o.cells),
47
+ "comments" => sexpify(o.comments),
48
+ "line" => o.line,
49
+ }
50
+ elsif(Formatter::Model::Comment === o)
51
+ o.value
52
+ elsif(Formatter::Model::Tag === o)
53
+ o.name
54
+ else
55
+ o
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ #encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module Gherkin
5
+ module Lexer
6
+ shared_examples_for "parsing windows files" do
7
+ describe "with BOM" do
8
+ it "should work just fine" do
9
+ scan_file("with_bom.feature")
10
+ @listener.to_sexp.should == [
11
+ [:feature, "Feature", "Feature Text", "", 1],
12
+ [:scenario, "Scenario", "Reading a Scenario", "", 2],
13
+ [:step, "Given ", "there is a step", 3],
14
+ [:eof]
15
+ ]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end