kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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 (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -1,173 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class BaseStep
4
- attr_reader :scenario
5
- attr_accessor :error
6
-
7
- def self.new_id!
8
- @next_id ||= -1
9
- @next_id += 1
10
- end
11
-
12
- attr_reader :error
13
-
14
- def file
15
- @scenario.file
16
- end
17
-
18
- def steps
19
- self
20
- end
21
-
22
- def length
23
- keyword.jlength + 1 + name.jlength
24
- end
25
-
26
- if defined?(JRUBY_VERSION)
27
- PENDING_ADJUSTMENT = 2
28
- REGULAR_ADJUSTMENT = 1
29
- else
30
- PENDING_ADJUSTMENT = 3
31
- REGULAR_ADJUSTMENT = 2
32
- end
33
-
34
- def execute_in(world, regexp, args, proc)
35
- strip_pos = nil
36
- begin
37
- proc.call_in(world, *args)
38
- rescue ArityMismatchError => e
39
- e.backtrace[0] = proc.to_backtrace_line
40
- strip_pos = e.backtrace.index("#{__FILE__}:#{__LINE__ - 3}:in `execute_in'")
41
- format_error(strip_pos, proc, e)
42
- rescue => e
43
- method_line = "#{__FILE__}:#{__LINE__ - 6}:in `execute_in'"
44
-
45
- # IronRuby returns nil for backtrace...
46
- if e.backtrace.nil?
47
- def e.backtrace
48
- @cucumber_backtrace ||= []
49
- end
50
- end
51
-
52
- method_line_pos = e.backtrace.index(method_line)
53
- if method_line_pos
54
- strip_pos = method_line_pos - (Pending === e ? PENDING_ADJUSTMENT : REGULAR_ADJUSTMENT)
55
- else
56
- # This happens with rails, because they screw up the backtrace
57
- # before we get here (injecting erb stacktrace and such)
58
- end
59
- format_error(strip_pos, proc, e)
60
- end
61
- end
62
-
63
- def format_error(strip_pos, proc, e)
64
- @error = e
65
- # Remove lines underneath the plain text step
66
- e.backtrace[strip_pos..-1] = nil unless strip_pos.nil?
67
- e.backtrace.compact!
68
- # Replace the step line with something more readable
69
- e.backtrace.replace(e.backtrace.map{|l| l.gsub(/`#{proc.meth}'/, "`#{keyword} #{proc.name}'")})
70
- if row?
71
- e.backtrace << "#{file}:#{line}:in `#{proc.name}'"
72
- else
73
- e.backtrace << "#{file}:#{line}:in `#{keyword} #{name}'"
74
- end
75
- raise e
76
- end
77
-
78
- def id
79
- @id ||= self.class.new_id!
80
- end
81
-
82
- def actual_keyword
83
- keyword == Cucumber.language['and'] ? previous_step.actual_keyword : keyword
84
- end
85
-
86
- def previous_step
87
- @scenario.previous_step(self)
88
- end
89
-
90
- def padding_length
91
- @scenario.step_padding_length(self)
92
- end
93
-
94
- def forced_to_pending?
95
- @error.kind_of?(ForcedPending)
96
- end
97
-
98
- def outline?
99
- false
100
- end
101
- end
102
-
103
- class Step < BaseStep
104
- attr_reader :keyword, :name, :line
105
- attr_accessor :arity, :extra_args
106
-
107
- def row?
108
- false
109
- end
110
-
111
- def initialize(scenario, keyword, name, line)
112
- @scenario, @keyword, @name, @line = scenario, keyword, name, line
113
- @extra_args ||= []
114
- @arity = 0
115
- end
116
-
117
- def regexp_args_proc(step_mother)
118
- regexp, args, proc = step_mother.regexp_args_proc(name)
119
- @arity = args.length
120
- [regexp, (args + extra_args), proc]
121
- end
122
-
123
- def format(regexp, format=nil, &proc)
124
- regexp.nil? ? name : name.gzub(regexp, format, &proc)
125
- end
126
- end
127
-
128
- class StepOutline < Step
129
- def outline?
130
- true
131
- end
132
- end
133
-
134
- class RowStep < BaseStep
135
- attr_reader :keyword
136
-
137
- def initialize(scenario, step, args)
138
- @scenario, @step, @args = scenario, step, args
139
- end
140
-
141
- def regexp_args_proc(step_mother)
142
- regexp, _, proc = @step.regexp_args_proc(step_mother)
143
- [regexp, @args, proc]
144
- end
145
-
146
- def row?
147
- true
148
- end
149
-
150
- def line
151
- @scenario.line
152
- end
153
- end
154
-
155
- class RowStepOutline < Step
156
- attr_reader :visible_args
157
-
158
- def initialize(scenario, step, name, visible_args, line)
159
- @visible_args = visible_args
160
- @extra_args = step.extra_args
161
- super(scenario, keyword, name, line)
162
- end
163
-
164
- def row?
165
- true
166
- end
167
-
168
- def outline?
169
- true
170
- end
171
- end
172
- end
173
- end
@@ -1,26 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class Table
4
- def initialize(rows)
5
- @rows = rows
6
- end
7
-
8
- def |(cell)
9
- @row ||= []
10
- if cell == self
11
- line = *caller[0].split(':')[1].to_i
12
- @row.instance_eval %{
13
- def line
14
- #{line}
15
- end
16
- }
17
- @rows << @row
18
- @row = nil
19
- else
20
- @row << cell.to_s
21
- end
22
- self
23
- end
24
- end
25
- end
26
- end
@@ -1,23 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class TopDownVisitor
4
- def visit_features(features)
5
- features.accept(self)
6
- end
7
-
8
- def visit_feature(feature)
9
- feature.accept(self)
10
- end
11
-
12
- def visit_header(header)
13
- end
14
-
15
- def visit_scenario(scenario)
16
- scenario.accept(self)
17
- end
18
-
19
- def visit_step(step)
20
- end
21
- end
22
- end
23
- end
@@ -1,254 +0,0 @@
1
- # encoding: utf-8
2
- module Cucumber
3
- # :stopdoc:
4
- module TreetopParser
5
- grammar Feature
6
- rule root
7
- space? header scenario_sequence space? {
8
- def compile
9
- feature = Tree::Feature.new(header.text_value.strip)
10
- scenario_sequence.compile(feature)
11
- feature
12
- end
13
- }
14
- end
15
-
16
- rule header
17
- (!(scenario_keyword / scenario_outline_keyword / comment_to_eol) .)+
18
- end
19
-
20
- rule scenario_sequence
21
- head:scenario_outline_or_scenario? tail:(space scenario_or_scenario_outline_or_table)* {
22
- def compile(feature)
23
- ([head] + tail).each do |scenario_or_scenario_outline_or_table|
24
- scenario_or_scenario_outline_or_table.compile(feature) if scenario_or_scenario_outline_or_table.respond_to?(:compile)
25
- end
26
- end
27
-
28
- def tail
29
- super.elements.map { |elt| elt.scenario_or_scenario_outline_or_table }
30
- end
31
- }
32
- end
33
-
34
- rule scenario_outline_or_scenario
35
- scenario_outline / scenario
36
- end
37
-
38
- rule scenario
39
- scenario_keyword space? name:line_to_eol steps:(space step_sequence)? {
40
- def compile(feature)
41
- line = input.line_of(interval.first)
42
- scenario = feature.add_scenario(name.text_value.strip, line)
43
- steps.step_sequence.compile(scenario) if steps.respond_to?(:step_sequence)
44
- # TODO - GET RID OF THIS last_scenario NASTINESS
45
- # Use a better datastructure, like a linked list...
46
- Feature.last_scenario = scenario
47
- end
48
- }
49
- end
50
-
51
- rule scenario_outline
52
- scenario_outline_keyword space? name:line_to_eol outline_body:(steps_and_optional_examples)? {
53
- def compile(feature)
54
- line = input.line_of(interval.first)
55
- scenario = feature.add_scenario_outline(name.text_value.strip, line)
56
- Feature.last_scenario = scenario
57
- outline_body.compile(feature, scenario) if outline_body.respond_to?(:compile)
58
- end
59
- }
60
- end
61
-
62
- rule scenario_or_scenario_outline_or_table
63
- scenario_outline / (scenario / more_examples)
64
- end
65
-
66
- rule steps_and_optional_examples
67
- steps:(space step_sequence) table:(space examples)? {
68
- def compile(feature, scenario)
69
- steps.step_sequence.compile(scenario) if steps.respond_to?(:step_sequence)
70
- table.examples.compile(feature, scenario) if table.respond_to?(:examples) && table.examples.respond_to?(:compile)
71
- end
72
- }
73
- end
74
-
75
- rule more_examples
76
- more_examples_keyword table {
77
- def compile(f)
78
- table.compile(f)
79
- end
80
- }
81
- end
82
-
83
- rule examples
84
- examples_keyword table {
85
- def compile(feature, scenario)
86
- table.compile_examples(feature, scenario)
87
- end
88
- }
89
- end
90
-
91
- rule table
92
- space head:table_line body:(blank* eol space? table_line)* {
93
- def compile(feature)
94
- Feature.last_scenario.table_header = head.cell_values
95
- body.each do |table_line|
96
- feature.add_row_scenario(Feature.last_scenario, table_line.cell_values, table_line.line)
97
- end
98
- end
99
-
100
- def compile_examples(feature, scenario)
101
- scenario.table_header = head.cell_values
102
- body.each do |table_line|
103
- feature.add_row_scenario_outline(scenario, table_line.cell_values, table_line.line)
104
- end
105
- end
106
-
107
- def matrix
108
- ([head] + body).map do |table_line|
109
- table_line.cell_values # We're losing the line - we'll get it back when we make our own class
110
- end
111
- end
112
-
113
- def to_arg
114
- Model::Table.new(matrix)
115
- end
116
-
117
- def body
118
- super.elements.map { |elt| elt.table_line }
119
- end
120
- }
121
- end
122
-
123
- rule table_line
124
- separator cells:(blank* cell_value blank* separator)+ {
125
- def cell_values
126
- cells.elements.map { |elt| elt.cell_value.text_value.strip }
127
- end
128
-
129
- def line
130
- input.line_of(interval.first)
131
- end
132
- }
133
- end
134
-
135
- rule cell_value
136
- (!(separator / eol) .)*
137
- end
138
-
139
- rule step_sequence
140
- head:step tail:(space step)* {
141
- def compile(scenario)
142
- ([head] + tail).each do |step|
143
- step.compile(scenario)
144
- end
145
- end
146
-
147
- def tail
148
- super.elements.map { |elt| elt.step }
149
- end
150
- }
151
- end
152
-
153
- rule step
154
- given_scenario / plain_step
155
- end
156
-
157
- rule given_scenario
158
- given_scenario_keyword space? name:line_to_eol {
159
- def compile(scenario)
160
- line = input.line_of(interval.first)
161
- scenario.create_given_scenario(name.text_value.strip, line)
162
- end
163
- }
164
- end
165
-
166
- rule plain_step
167
- step_keyword space? name:line_to_eol multi:multiline_arg? {
168
- def compile(scenario)
169
- line = input.line_of(interval.first)
170
- step = scenario.create_step(step_keyword.text_value, name.text_value.strip, line)
171
-
172
- if multi.respond_to?(:to_arg)
173
- step.extra_args << multi.to_arg
174
- end
175
- end
176
- }
177
- end
178
-
179
- rule multiline_arg
180
- table / multiline_string
181
- end
182
-
183
- rule multiline_string
184
- eol indent:space triple_quote string:(!triple_quote .)* triple_quote {
185
- def to_arg
186
- indent_length = indent.text_value.length
187
- significant_lines = string.text_value.split("\n")[1..-2]
188
- significant_lines.map do |l|
189
- l[indent_length..-1]
190
- end.join("\n")
191
- end
192
- }
193
- end
194
-
195
- rule triple_quote
196
- '"""'
197
- end
198
-
199
- rule separator
200
- '|'
201
- end
202
-
203
- rule space
204
- (white / comment_to_eol)+
205
- end
206
-
207
- rule line_to_eol
208
- (!eol .)*
209
- end
210
-
211
- rule comment_to_eol
212
- '#' line_to_eol
213
- end
214
-
215
- rule white
216
- blank / eol
217
- end
218
-
219
- rule blank
220
- [ \t]
221
- end
222
-
223
- rule eol
224
- ("\r" "\n"?) / "\n"
225
- end
226
-
227
- rule step_keyword
228
- "<%= words['given'] %>" / "<%= words['when'] %>" / "<%= words['then'] %>" / "<%= words['and'] %>" / "<%= words['but'] %>"
229
- end
230
-
231
- rule scenario_keyword
232
- "<%= words['scenario'] %>" ":"?
233
- end
234
-
235
- rule scenario_outline_keyword
236
- "<%= words['scenario_outline'] %>" ":"?
237
- end
238
-
239
- rule more_examples_keyword
240
- "<%= words['more_examples'] %>" ":"?
241
- end
242
-
243
- rule examples_keyword
244
- "<%= words['examples'] %>" ":"?
245
- end
246
-
247
- rule given_scenario_keyword
248
- "<%= words['given_scenario'] %>" ":"?
249
- end
250
-
251
- end
252
-
253
- end
254
- end