aslakhellesoy-cucumber 0.3.95 → 0.3.96
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.
- data/History.txt +21 -0
- data/Manifest.txt +9 -3
- data/examples/sinatra/features/support/env.rb +1 -3
- data/features/cucumber_cli.feature +1 -0
- data/features/drb_server_integration.feature +56 -3
- data/features/junit_formatter.feature +23 -12
- data/features/step_definitions/cucumber_steps.rb +13 -2
- data/features/support/env.rb +19 -3
- data/lib/cucumber/ast/feature_element.rb +1 -1
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +3 -2
- data/lib/cucumber/cli/configuration.rb +9 -25
- data/lib/cucumber/cli/drb_client.rb +7 -3
- data/lib/cucumber/cli/language_help_formatter.rb +4 -4
- data/lib/cucumber/cli/main.rb +26 -46
- data/lib/cucumber/cli/options.rb +3 -0
- data/lib/cucumber/constantize.rb +28 -0
- data/lib/cucumber/feature_file.rb +3 -3
- data/lib/cucumber/formatter/junit.rb +13 -9
- data/lib/cucumber/formatter/pretty.rb +2 -2
- data/lib/cucumber/language_support/hook_methods.rb +9 -0
- data/lib/cucumber/language_support/language_methods.rb +47 -0
- data/lib/cucumber/language_support/step_definition_methods.rb +44 -0
- data/lib/cucumber/parser/natural_language.rb +72 -0
- data/lib/cucumber/rb_support/rb_dsl.rb +73 -0
- data/lib/cucumber/rb_support/rb_hook.rb +19 -0
- data/lib/cucumber/rb_support/rb_language.rb +129 -0
- data/lib/cucumber/rb_support/rb_step_definition.rb +56 -0
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/step_mother.rb +87 -206
- data/lib/cucumber/version.rb +1 -1
- data/lib/cucumber/webrat/element_locator.rb +7 -7
- data/lib/cucumber/world.rb +28 -8
- data/rails_generators/cucumber/templates/cucumber_environment.rb +2 -2
- data/rails_generators/cucumber/templates/spork_env.rb +0 -2
- data/rails_generators/cucumber/templates/webrat_steps.rb +17 -0
- data/spec/cucumber/ast/background_spec.rb +8 -5
- data/spec/cucumber/ast/feature_factory.rb +4 -5
- data/spec/cucumber/ast/feature_spec.rb +7 -1
- data/spec/cucumber/ast/scenario_outline_spec.rb +10 -6
- data/spec/cucumber/ast/scenario_spec.rb +8 -3
- data/spec/cucumber/ast/step_collection_spec.rb +2 -2
- data/spec/cucumber/cli/configuration_spec.rb +15 -0
- data/spec/cucumber/cli/drb_client_spec.rb +35 -1
- data/spec/cucumber/cli/main_spec.rb +5 -4
- data/spec/cucumber/cli/options_spec.rb +6 -0
- data/spec/cucumber/parser/feature_parser_spec.rb +6 -5
- data/spec/cucumber/parser/table_parser_spec.rb +1 -1
- data/spec/cucumber/step_definition_spec.rb +26 -25
- data/spec/cucumber/step_mother_spec.rb +46 -41
- data/spec/cucumber/world/pending_spec.rb +4 -5
- metadata +11 -5
- data/lib/cucumber/cli/rb_step_def_loader.rb +0 -14
- data/lib/cucumber/parser/i18n/language.rb +0 -87
- data/lib/cucumber/step_definition.rb +0 -122
data/lib/cucumber/step_mother.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
require 'cucumber/
|
1
|
+
require 'cucumber/constantize'
|
2
2
|
require 'cucumber/world'
|
3
3
|
require 'cucumber/core_ext/instance_exec'
|
4
|
+
require 'cucumber/parser/natural_language'
|
5
|
+
require 'cucumber/language_support/hook_methods'
|
6
|
+
require 'cucumber/language_support/language_methods'
|
7
|
+
require 'cucumber/language_support/step_definition_methods'
|
4
8
|
|
5
9
|
module Cucumber
|
6
10
|
class Undefined < StandardError
|
@@ -45,61 +49,56 @@ module Cucumber
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
48
|
-
class NilWorld < StandardError
|
49
|
-
def initialize
|
50
|
-
super("World procs should never return nil")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class MultipleWorld < StandardError
|
55
|
-
def initialize(first_proc, second_proc)
|
56
|
-
message = "You can only pass a proc to #World once, but it's happening\n"
|
57
|
-
message << "in 2 places:\n\n"
|
58
|
-
message << first_proc.backtrace_line('World') << "\n"
|
59
|
-
message << second_proc.backtrace_line('World') << "\n\n"
|
60
|
-
message << "Use Ruby modules instead to extend your worlds. See the Cucumber::StepMother#World RDoc\n"
|
61
|
-
message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
|
62
|
-
super(message)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
52
|
# This is the main interface for registering step definitions, which is done
|
67
53
|
# from <tt>*_steps.rb</tt> files. This module is included right at the top-level
|
68
54
|
# so #register_step_definition (and more interestingly - its aliases) are
|
69
55
|
# available from the top-level.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
@proc = proc
|
75
|
-
end
|
56
|
+
class StepMother
|
57
|
+
include Constantize
|
58
|
+
|
59
|
+
attr_writer :options, :visitor
|
76
60
|
|
77
|
-
|
78
|
-
|
79
|
-
|
61
|
+
def initialize
|
62
|
+
@programming_languages = []
|
63
|
+
@language_map = {}
|
64
|
+
load_natural_language('en')
|
65
|
+
end
|
80
66
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
67
|
+
# Loads and registers programming language implementation.
|
68
|
+
# Instances are cached, so calling with the same argument
|
69
|
+
# twice will return the same instance.
|
70
|
+
#
|
71
|
+
# Raises an exception if the language can't be loaded.
|
72
|
+
#
|
73
|
+
def load_programming_language(ext)
|
74
|
+
return @language_map[ext] if @language_map[ext]
|
75
|
+
programming_language_class = constantize("Cucumber::#{ext.capitalize}Support::#{ext.capitalize}Language")
|
76
|
+
programming_language = programming_language_class.new(self)
|
77
|
+
programming_language.alias_adverbs(@adverbs || [])
|
78
|
+
@programming_languages << programming_language
|
79
|
+
@language_map[ext] = programming_language
|
80
|
+
programming_language
|
81
|
+
end
|
82
|
+
|
83
|
+
# Loads a natural language. This has the effect of aliasing
|
84
|
+
# Step Definition keywords for all of the registered programming
|
85
|
+
# languages (if they support aliasing). See #load_programming_language
|
86
|
+
#
|
87
|
+
def load_natural_language(lang)
|
88
|
+
Parser::NaturalLanguage.get(self, lang)
|
92
89
|
end
|
93
90
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
91
|
+
# Registers a StepDefinition. This can be a Ruby StepDefintion,
|
92
|
+
# or any other kind of object that implements the StepDefintion
|
93
|
+
# contract (API).
|
94
|
+
def register_step_definition(step_definition)
|
95
|
+
step_definitions.each do |already|
|
96
|
+
raise Redundant.new(already, step_definition) if already.same_regexp?(step_definition.regexp)
|
98
97
|
end
|
98
|
+
step_definitions << step_definition
|
99
|
+
step_definition
|
99
100
|
end
|
100
101
|
|
101
|
-
attr_writer :snippet_generator, :options, :visitor
|
102
|
-
|
103
102
|
def options
|
104
103
|
@options ||= {}
|
105
104
|
end
|
@@ -117,6 +116,10 @@ module Cucumber
|
|
117
116
|
end
|
118
117
|
end
|
119
118
|
|
119
|
+
def announce(msg)
|
120
|
+
@visitor.announce(msg)
|
121
|
+
end
|
122
|
+
|
120
123
|
def scenarios(status = nil)
|
121
124
|
@scenarios ||= []
|
122
125
|
if(status)
|
@@ -126,44 +129,8 @@ module Cucumber
|
|
126
129
|
end
|
127
130
|
end
|
128
131
|
|
129
|
-
|
130
|
-
|
131
|
-
# also to the i18n translations whenever a feature of a
|
132
|
-
# new language is loaded.
|
133
|
-
#
|
134
|
-
# See Cucumber#alias_steps for details on how to
|
135
|
-
# create your own aliases.
|
136
|
-
#
|
137
|
-
# The +&proc+ gets executed in the context of a <tt>world</tt>
|
138
|
-
# object, which is defined by #World. A new <tt>world</tt>
|
139
|
-
# object is created for each scenario and is shared across
|
140
|
-
# step definitions within that scenario.
|
141
|
-
def register_step_definition(regexp, &proc)
|
142
|
-
step_definition = StepDefinition.new(regexp, &proc)
|
143
|
-
step_definitions.each do |already|
|
144
|
-
raise Redundant.new(already, step_definition) if already.match(regexp)
|
145
|
-
end
|
146
|
-
step_definitions << step_definition
|
147
|
-
step_definition
|
148
|
-
end
|
149
|
-
|
150
|
-
# Registers a Before proc. You can call this method as many times as you
|
151
|
-
# want (typically from ruby scripts under <tt>support</tt>).
|
152
|
-
def Before(*tag_names, &proc)
|
153
|
-
register_hook(:before, tag_names, proc)
|
154
|
-
end
|
155
|
-
|
156
|
-
def After(*tag_names, &proc)
|
157
|
-
register_hook(:after, tag_names, proc)
|
158
|
-
end
|
159
|
-
|
160
|
-
def AfterStep(*tag_names, &proc)
|
161
|
-
register_hook(:after_step, tag_names, proc)
|
162
|
-
end
|
163
|
-
|
164
|
-
def register_hook(phase, tags, proc)
|
165
|
-
hook = Hook.new(tags, proc)
|
166
|
-
hooks[phase] << hook
|
132
|
+
def register_hook(phase, hook)
|
133
|
+
hooks[phase.to_sym] << hook
|
167
134
|
hook
|
168
135
|
end
|
169
136
|
|
@@ -172,53 +139,7 @@ module Cucumber
|
|
172
139
|
end
|
173
140
|
|
174
141
|
def hooks_for(phase, scenario)
|
175
|
-
hooks[phase].select{|hook| scenario.accept_hook?(hook)}
|
176
|
-
end
|
177
|
-
|
178
|
-
# Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
|
179
|
-
# The +proc+ will be executed once before each scenario to create an
|
180
|
-
# Object that the scenario's steps will run within. Any +world_modules+
|
181
|
-
# will be mixed into this Object (via Object#extend).
|
182
|
-
#
|
183
|
-
# This method is typically called from one or more Ruby scripts under
|
184
|
-
# <tt>features/support</tt>. You can call this method as many times as you
|
185
|
-
# like (to register more modules), but if you try to register more than
|
186
|
-
# one Proc you will get an error.
|
187
|
-
#
|
188
|
-
# Cucumber will not yield anything to the +proc+ (like it used to do before v0.3).
|
189
|
-
#
|
190
|
-
# In earlier versions of Cucumber (before 0.3) you could not register
|
191
|
-
# any +world_modules+. Instead you would register several Proc objects (by
|
192
|
-
# calling the method several times). The result of each +proc+ would be yielded
|
193
|
-
# to the next +proc+. Example:
|
194
|
-
#
|
195
|
-
# World do |world| # NOT SUPPORTED FROM 0.3
|
196
|
-
# MyClass.new
|
197
|
-
# end
|
198
|
-
#
|
199
|
-
# World do |world| # NOT SUPPORTED FROM 0.3
|
200
|
-
# world.extend(MyModule)
|
201
|
-
# end
|
202
|
-
#
|
203
|
-
# From Cucumber 0.3 the recommended way to do this is:
|
204
|
-
#
|
205
|
-
# World do
|
206
|
-
# MyClass.new
|
207
|
-
# end
|
208
|
-
#
|
209
|
-
# World(MyModule)
|
210
|
-
#
|
211
|
-
def World(*world_modules, &proc)
|
212
|
-
if(proc)
|
213
|
-
raise MultipleWorld.new(@world_proc, proc) if @world_proc
|
214
|
-
@world_proc = proc
|
215
|
-
end
|
216
|
-
@world_modules ||= []
|
217
|
-
@world_modules += world_modules
|
218
|
-
end
|
219
|
-
|
220
|
-
def current_world
|
221
|
-
@current_world
|
142
|
+
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
222
143
|
end
|
223
144
|
|
224
145
|
def step_match(step_name, formatted_step_name=nil)
|
@@ -257,108 +178,68 @@ module Cucumber
|
|
257
178
|
end
|
258
179
|
|
259
180
|
def snippet_text(step_keyword, step_name, multiline_arg_class)
|
260
|
-
@
|
181
|
+
@programming_languages.map do |programming_language|
|
182
|
+
programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
|
183
|
+
end.join("\n")
|
261
184
|
end
|
262
185
|
|
263
186
|
def before_and_after(scenario, skip_hooks=false)
|
264
187
|
before(scenario) unless skip_hooks
|
265
|
-
@current_scenario = scenario
|
266
188
|
yield scenario
|
267
|
-
@current_scenario = nil
|
268
189
|
after(scenario) unless skip_hooks
|
269
190
|
scenario_visited(scenario)
|
270
191
|
end
|
271
|
-
|
272
|
-
def before(scenario)
|
273
|
-
unless current_world
|
274
|
-
new_world!
|
275
|
-
execute_before(scenario)
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
def after(scenario)
|
280
|
-
execute_after(scenario)
|
281
|
-
nil_world!
|
282
|
-
end
|
283
|
-
|
284
|
-
def after_step
|
285
|
-
execute_after_step(@current_scenario)
|
286
|
-
end
|
287
|
-
|
288
|
-
private
|
289
192
|
|
290
|
-
def
|
291
|
-
@
|
193
|
+
def register_adverbs(adverbs)
|
194
|
+
@adverbs ||= []
|
195
|
+
@adverbs += adverbs
|
196
|
+
@adverbs.uniq!
|
197
|
+
@programming_languages.each do |programming_language|
|
198
|
+
programming_language.alias_adverbs(@adverbs)
|
199
|
+
end
|
292
200
|
end
|
293
201
|
|
294
|
-
|
295
|
-
def new_world!
|
202
|
+
def begin_scenario
|
296
203
|
return if options[:dry_run]
|
297
|
-
|
298
|
-
|
299
|
-
connect_world
|
300
|
-
@current_world
|
301
|
-
end
|
302
|
-
|
303
|
-
def create_world!
|
304
|
-
if(@world_proc)
|
305
|
-
@current_world = @world_proc.call
|
306
|
-
check_nil(@current_world, @world_proc)
|
307
|
-
else
|
308
|
-
@current_world = Object.new
|
204
|
+
@programming_languages.each do |programming_language|
|
205
|
+
programming_language.begin_scenario
|
309
206
|
end
|
310
207
|
end
|
311
208
|
|
312
|
-
def
|
313
|
-
|
314
|
-
@
|
315
|
-
|
316
|
-
@current_world.extend(mod)
|
209
|
+
def end_scenario
|
210
|
+
return if options[:dry_run]
|
211
|
+
@programming_languages.each do |programming_language|
|
212
|
+
programming_language.end_scenario
|
317
213
|
end
|
318
214
|
end
|
319
|
-
|
320
|
-
def
|
321
|
-
|
322
|
-
@
|
323
|
-
|
324
|
-
|
325
|
-
def check_nil(o, proc)
|
326
|
-
if o.nil?
|
327
|
-
begin
|
328
|
-
raise NilWorld.new
|
329
|
-
rescue NilWorld => e
|
330
|
-
e.backtrace.clear
|
331
|
-
e.backtrace.push(proc.backtrace_line("World"))
|
332
|
-
raise e
|
333
|
-
end
|
334
|
-
else
|
335
|
-
o
|
215
|
+
|
216
|
+
def before(scenario)
|
217
|
+
return if options[:dry_run] || @current_scenario
|
218
|
+
@current_scenario = scenario
|
219
|
+
@programming_languages.each do |programming_language|
|
220
|
+
programming_language.before(scenario)
|
336
221
|
end
|
337
222
|
end
|
338
|
-
|
339
|
-
def
|
340
|
-
@
|
341
|
-
end
|
342
|
-
|
343
|
-
def execute_before(scenario)
|
223
|
+
|
224
|
+
def after(scenario)
|
225
|
+
@current_scenario = nil
|
344
226
|
return if options[:dry_run]
|
345
|
-
|
346
|
-
|
227
|
+
@programming_languages.each do |programming_language|
|
228
|
+
programming_language.after(scenario)
|
347
229
|
end
|
348
230
|
end
|
349
|
-
|
350
|
-
def
|
231
|
+
|
232
|
+
def after_step
|
351
233
|
return if options[:dry_run]
|
352
|
-
|
353
|
-
|
234
|
+
@programming_languages.each do |programming_language|
|
235
|
+
programming_language.execute_after_step(@current_scenario)
|
354
236
|
end
|
355
237
|
end
|
238
|
+
|
239
|
+
private
|
356
240
|
|
357
|
-
def
|
358
|
-
|
359
|
-
hooks_for(:after_step, scenario).each do |hook|
|
360
|
-
hook.execute_in(@current_world, scenario, 'AfterStep', false)
|
361
|
-
end
|
241
|
+
def max_step_definition_length
|
242
|
+
@max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
|
362
243
|
end
|
363
244
|
|
364
245
|
def scenario_visited(scenario)
|
data/lib/cucumber/version.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module Webrat
|
2
2
|
class Element
|
3
|
-
# Returns an Array of Array of String where each String is
|
4
|
-
#
|
3
|
+
# Returns an Array of Array of String where each String is a
|
4
|
+
# "cell" in the table-like structure represented by this Element.
|
5
5
|
#
|
6
|
-
# Supported elements are table, dl, ol and ul.
|
7
|
-
# on the
|
6
|
+
# Supported elements are table, dl, ol and ul. Different conversion
|
7
|
+
# strategies are used depending on the kind of element:
|
8
8
|
#
|
9
|
-
# * table : Each tr
|
9
|
+
# * table : Each tr becomes a row. The innerHTML of each td or th inside becomes a cell. The number
|
10
10
|
# of columns is determined by the number of cells in the first row.
|
11
|
-
# * dl : Each dt
|
12
|
-
# * ul or ol : Each
|
11
|
+
# * dl : Each dt becomes a row with 2 cells. The innerHTML of the dt itself and the next dd become cells.
|
12
|
+
# * ul or ol : Each li becomes a row with one cell, the innerHTML of the li.
|
13
13
|
#
|
14
14
|
def to_table
|
15
15
|
case element.name
|
data/lib/cucumber/world.rb
CHANGED
@@ -7,23 +7,43 @@ module Cucumber
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
attr_writer :__cucumber_step_mother
|
10
|
+
attr_writer :__cucumber_step_mother
|
11
11
|
|
12
12
|
# Call a step from within a step definition
|
13
13
|
def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
|
14
14
|
begin
|
15
15
|
step_match = @__cucumber_step_mother.step_match(name)
|
16
|
-
step_match.invoke(
|
16
|
+
step_match.invoke(multiline_argument)
|
17
17
|
rescue Exception => e
|
18
18
|
e.nested! if Undefined === e
|
19
|
-
@__cucumber_current_step.exception = e if @__cucumber_current_step
|
20
19
|
raise e
|
21
20
|
end
|
22
21
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
|
23
|
+
# Returns a Cucumber::Ast::Table for +text_or_table+, which can either
|
24
|
+
# be a String:
|
25
|
+
#
|
26
|
+
# table(%{
|
27
|
+
# | account | description | amount |
|
28
|
+
# | INT-100 | Taxi | 114 |
|
29
|
+
# | CUC-101 | Peeler | 22 |
|
30
|
+
# })
|
31
|
+
#
|
32
|
+
# or a 2D Array:
|
33
|
+
#
|
34
|
+
# table([
|
35
|
+
# %w{ account description amount },
|
36
|
+
# %w{ INT-100 Taxi 114 },
|
37
|
+
# %w{ CUC-101 Peeler 22 }
|
38
|
+
# ])
|
39
|
+
#
|
40
|
+
def table(text_or_table, file=nil, line_offset=0)
|
41
|
+
if Array === text_or_table
|
42
|
+
Ast::Table.new(text_or_table)
|
43
|
+
else
|
44
|
+
@table_parser ||= Parser::TableParser.new
|
45
|
+
@table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
|
46
|
+
end
|
27
47
|
end
|
28
48
|
|
29
49
|
# Output +announcement+ alongside the formatted output.
|
@@ -34,7 +54,7 @@ module Cucumber
|
|
34
54
|
# step. This is because the step itself will not be printed until
|
35
55
|
# after it has run, so it can be coloured according to its status.
|
36
56
|
def announce(announcement)
|
37
|
-
@
|
57
|
+
@__cucumber_step_mother.announce(announcement)
|
38
58
|
end
|
39
59
|
|
40
60
|
def pending(message = "TODO")
|
@@ -16,11 +16,11 @@ config.action_controller.allow_forgery_protection = false
|
|
16
16
|
config.action_mailer.delivery_method = :test
|
17
17
|
|
18
18
|
config.gem 'cucumber', :lib => false, :version => '>=<%= cucumber_version %>' unless File.directory?(File.join(Rails.root, 'vendor/plugins/cucumber'))
|
19
|
-
config.gem 'webrat', :lib => false, :version => '>=0.
|
19
|
+
config.gem 'webrat', :lib => false, :version => '>=0.5.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
|
20
20
|
<% if framework == :rspec -%>
|
21
21
|
config.gem 'rspec', :lib => false, :version => '>=1.2.6' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec'))
|
22
22
|
config.gem 'rspec-rails', :lib => 'spec/rails', :version => '>=1.2.6' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
|
23
23
|
<% end %>
|
24
24
|
<% if spork? -%>
|
25
|
-
config.gem 'spork', :lib => false, :version => '>=0.5.
|
25
|
+
config.gem 'spork', :lib => false, :version => '>=0.5.9' unless File.directory?(File.join(Rails.root, 'vendor/plugins/spork'))
|
26
26
|
<% end %>
|
@@ -18,14 +18,12 @@ Spork.prefork do
|
|
18
18
|
|
19
19
|
# Comment out the next line if you don't want Cucumber Unicode support
|
20
20
|
require 'cucumber/formatter/unicode'
|
21
|
-
|
22
21
|
require 'spec/rails'
|
23
22
|
require 'cucumber/rails/rspec'
|
24
23
|
end
|
25
24
|
|
26
25
|
Spork.each_run do
|
27
26
|
# This code will be run each time you run your specs.
|
28
|
-
require 'cucumber/rails/world'
|
29
27
|
|
30
28
|
# Comment out the next line if you don't want transactions to
|
31
29
|
# open/roll back around each scenario
|
@@ -27,6 +27,23 @@ When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
|
27
27
|
fill_in(field, :with => value)
|
28
28
|
end
|
29
29
|
|
30
|
+
# Use this to fill in an entire form with data from a table. Example:
|
31
|
+
#
|
32
|
+
# When I fill in the following:
|
33
|
+
# | Account Number | 5002 |
|
34
|
+
# | Expiry date | 2009-11-01 |
|
35
|
+
# | Note | Nice guy |
|
36
|
+
# | Wants Email? | |
|
37
|
+
#
|
38
|
+
# TODO: Add support for checkbox, select og option
|
39
|
+
# based on naming conventions.
|
40
|
+
#
|
41
|
+
When /^I fill in the following:$/ do |fields|
|
42
|
+
fields.rows_hash.each do |name, value|
|
43
|
+
When %{I fill in "#{name}" with "#{value}"}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
30
47
|
When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
|
31
48
|
select(value, :from => field)
|
32
49
|
end
|
@@ -1,18 +1,22 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
require 'cucumber/ast'
|
3
|
+
require 'cucumber/rb_support/rb_language'
|
3
4
|
|
4
5
|
module Cucumber
|
5
6
|
module Ast
|
6
7
|
describe Background do
|
7
8
|
|
8
9
|
before do
|
9
|
-
|
10
|
-
@step_mother.
|
10
|
+
extend(RbSupport::RbDsl)
|
11
|
+
@step_mother = StepMother.new
|
12
|
+
@step_mother.load_natural_language('en')
|
13
|
+
@step_mother.load_programming_language('rb')
|
14
|
+
|
11
15
|
$x = $y = nil
|
12
|
-
|
16
|
+
Before do
|
13
17
|
$x = 2
|
14
18
|
end
|
15
|
-
|
19
|
+
Given /y is (\d+)/ do |n|
|
16
20
|
$y = $x * n.to_i
|
17
21
|
end
|
18
22
|
@visitor = Visitor.new(@step_mother)
|
@@ -40,7 +44,6 @@ module Cucumber
|
|
40
44
|
name="",
|
41
45
|
steps=[])
|
42
46
|
background.feature = @feature
|
43
|
-
|
44
47
|
@visitor.visit_background(background)
|
45
48
|
$x.should == 2
|
46
49
|
$y.should == 10
|
@@ -10,14 +10,13 @@ module Cucumber
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
def create_feature(
|
14
|
-
|
15
|
-
step_mother.Given /^a (.*) step with an inline arg:$/ do |what, table|
|
13
|
+
def create_feature(dsl)
|
14
|
+
dsl.Given /^a (.*) step with an inline arg:$/ do |what, table|
|
16
15
|
end
|
17
|
-
|
16
|
+
dsl.Given /^a (.*) step$/ do |what|
|
18
17
|
flunk if what == 'failing'
|
19
18
|
end
|
20
|
-
|
19
|
+
dsl.World do
|
21
20
|
MyWorld.new
|
22
21
|
end
|
23
22
|
|
@@ -7,7 +7,13 @@ module Cucumber
|
|
7
7
|
include FeatureFactory
|
8
8
|
|
9
9
|
it "should convert to sexp" do
|
10
|
-
|
10
|
+
step_mother = StepMother.new
|
11
|
+
step_mother.load_natural_language('en')
|
12
|
+
step_mother.load_programming_language('rb')
|
13
|
+
dsl = Object.new
|
14
|
+
dsl.extend RbSupport::RbDsl
|
15
|
+
|
16
|
+
feature = create_feature(dsl)
|
11
17
|
feature.to_sexp.should ==
|
12
18
|
[:feature,
|
13
19
|
"features/pretty_printing.feature",
|
@@ -2,24 +2,28 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
require 'cucumber/step_mother'
|
3
3
|
require 'cucumber/ast'
|
4
4
|
require 'cucumber/core_ext/string'
|
5
|
+
require 'cucumber/rb_support/rb_language'
|
5
6
|
|
6
7
|
module Cucumber
|
7
8
|
module Ast
|
8
9
|
describe ScenarioOutline do
|
9
10
|
before do
|
10
|
-
@step_mother =
|
11
|
-
@step_mother.
|
11
|
+
@step_mother = StepMother.new
|
12
|
+
@step_mother.load_programming_language('rb')
|
13
|
+
@step_mother.load_natural_language('en')
|
14
|
+
@dsl = Object.new
|
15
|
+
@dsl.extend(RbSupport::RbDsl)
|
12
16
|
|
13
|
-
@
|
17
|
+
@dsl.Given(/^there are (\d+) cucumbers$/) do |n|
|
14
18
|
@initial = n.to_i
|
15
19
|
end
|
16
|
-
@
|
20
|
+
@dsl.When(/^I eat (\d+) cucumbers$/) do |n|
|
17
21
|
@eaten = n.to_i
|
18
22
|
end
|
19
|
-
@
|
23
|
+
@dsl.Then(/^I should have (\d+) cucumbers$/) do |n|
|
20
24
|
(@initial - @eaten).should == n.to_i
|
21
25
|
end
|
22
|
-
@
|
26
|
+
@dsl.Then(/^I should have (\d+) cucumbers in my belly$/) do |n|
|
23
27
|
@eaten.should == n.to_i
|
24
28
|
end
|
25
29
|
|
@@ -1,15 +1,20 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
require 'cucumber/step_mother'
|
3
3
|
require 'cucumber/ast'
|
4
|
+
require 'cucumber/rb_support/rb_language'
|
4
5
|
|
5
6
|
module Cucumber
|
6
7
|
module Ast
|
7
8
|
describe Scenario do
|
8
9
|
before do
|
9
|
-
@step_mother =
|
10
|
-
@step_mother.
|
10
|
+
@step_mother = StepMother.new
|
11
|
+
@step_mother.load_natural_language('en')
|
12
|
+
@step_mother.load_programming_language('rb')
|
13
|
+
@dsl = Object.new
|
14
|
+
@dsl.extend(RbSupport::RbDsl)
|
15
|
+
|
11
16
|
$x = $y = nil
|
12
|
-
@
|
17
|
+
@dsl.Given /y is (\d+)/ do |n|
|
13
18
|
$y = n.to_i
|
14
19
|
end
|
15
20
|
@visitor = Visitor.new(@step_mother)
|
@@ -6,8 +6,8 @@ module Cucumber
|
|
6
6
|
it "should convert And to Given in snippets" do
|
7
7
|
s1 = Step.new(1, 'Given', 'cukes')
|
8
8
|
s2 = Step.new(2, 'And', 'turnips')
|
9
|
-
s1.stub!(:language).and_return(Parser::
|
10
|
-
s2.stub!(:language).and_return(Parser::
|
9
|
+
s1.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
|
10
|
+
s2.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
|
11
11
|
c = StepCollection.new([s1, s2])
|
12
12
|
actual_keywords = c.step_invocations.map{|i| i.actual_keyword}
|
13
13
|
actual_keywords.should == %w{Given Given}
|