cucumber 0.4.3 → 0.4.4
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 +27 -0
- data/VERSION.yml +3 -2
- data/cucumber.gemspec +11 -5
- data/examples/watir/features/support/screenshots.rb +1 -2
- data/features/call_many_steps.feature +124 -0
- data/features/default_snippets.feature +2 -2
- data/features/expand.feature +13 -2
- data/features/language_help.feature +1 -1
- data/features/report_called_undefined_steps.feature +1 -1
- data/features/snippet.feature +2 -2
- data/features/support/env.rb +3 -5
- data/features/tag_logic.feature +32 -0
- data/features/wire_protocol.feature +7 -7
- data/lib/cucumber.rb +6 -0
- data/lib/cucumber/ast/background.rb +1 -1
- data/lib/cucumber/ast/comment.rb +1 -1
- data/lib/cucumber/ast/examples.rb +1 -1
- data/lib/cucumber/ast/feature.rb +1 -1
- data/lib/cucumber/ast/feature_element.rb +2 -3
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +17 -4
- data/lib/cucumber/ast/py_string.rb +3 -1
- data/lib/cucumber/ast/scenario.rb +3 -1
- data/lib/cucumber/ast/scenario_outline.rb +2 -2
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_collection.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +2 -1
- data/lib/cucumber/ast/table.rb +3 -3
- data/lib/cucumber/ast/tags.rb +18 -11
- data/lib/cucumber/ast/tree_walker.rb +16 -0
- data/lib/cucumber/cli/main.rb +3 -2
- data/lib/cucumber/cli/options.rb +4 -6
- data/lib/cucumber/cli/profile_loader.rb +4 -0
- data/lib/cucumber/filter.rb +2 -2
- data/lib/cucumber/formatter/ansicolor.rb +8 -0
- data/lib/cucumber/formatter/pretty.rb +3 -4
- data/lib/cucumber/language_support/language_methods.rb +4 -3
- data/lib/cucumber/languages.yml +1 -1
- data/lib/cucumber/parser.rb +2 -0
- data/lib/cucumber/parser/common.rb +170 -0
- data/lib/cucumber/parser/common.tt +21 -0
- data/lib/cucumber/parser/feature.rb +7 -291
- data/lib/cucumber/parser/feature.tt +7 -43
- data/lib/cucumber/parser/i18n.tt +2 -0
- data/lib/cucumber/parser/natural_language.rb +9 -0
- data/lib/cucumber/parser/py_string.rb +276 -0
- data/lib/cucumber/parser/py_string.tt +45 -0
- data/lib/cucumber/parser/table.rb +5 -120
- data/lib/cucumber/parser/table.tt +2 -13
- data/lib/cucumber/platform.rb +3 -2
- data/lib/cucumber/rails/active_record.rb +2 -21
- data/lib/cucumber/rails/world.rb +2 -1
- data/lib/cucumber/rb_support/rb_hook.rb +2 -1
- data/lib/cucumber/rb_support/rb_language.rb +8 -6
- data/lib/cucumber/rb_support/rb_step_definition.rb +4 -0
- data/lib/cucumber/rb_support/rb_world.rb +16 -37
- data/lib/cucumber/step_mother.rb +86 -2
- data/lib/cucumber/wire_support/wire_language.rb +2 -2
- data/lib/cucumber/wire_support/wire_protocol.rb +1 -1
- data/rails_generators/cucumber/cucumber_generator.rb +3 -1
- data/rails_generators/cucumber/templates/cucumber.rake +4 -2
- data/rails_generators/cucumber/templates/webrat_steps.rb +28 -28
- data/spec/cucumber/ast/background_spec.rb +2 -1
- data/spec/cucumber/ast/scenario_spec.rb +3 -1
- data/spec/cucumber/formatter/console_spec.rb +1 -1
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +14 -5
- data/spec/cucumber/step_mother_spec.rb +1 -1
- data/spec/cucumber/world/pending_spec.rb +1 -1
- metadata +8 -3
@@ -1,12 +1,13 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Parser
|
3
|
-
# TIP: When you hack on the grammar, just delete
|
3
|
+
# TIP: When you hack on the grammar, just delete table.rb in this directory.
|
4
4
|
# Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
|
5
5
|
# github gems).
|
6
6
|
#
|
7
7
|
# Treetop will then generate the parser in-memory. When you're happy, just generate
|
8
8
|
# the rb file with tt feature.tt
|
9
9
|
grammar Table
|
10
|
+
include Common
|
10
11
|
|
11
12
|
rule table
|
12
13
|
table_row+ {
|
@@ -54,18 +55,6 @@ module Cucumber
|
|
54
55
|
(!('|' / eol) .)*
|
55
56
|
end
|
56
57
|
|
57
|
-
rule space
|
58
|
-
[ \t]
|
59
|
-
end
|
60
|
-
|
61
|
-
rule eol
|
62
|
-
"\n" / ("\r" "\n"?)
|
63
|
-
end
|
64
|
-
|
65
|
-
rule eof
|
66
|
-
!.
|
67
|
-
end
|
68
|
-
|
69
58
|
end
|
70
59
|
end
|
71
60
|
end
|
data/lib/cucumber/platform.rb
CHANGED
@@ -11,8 +11,9 @@ module Cucumber
|
|
11
11
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
12
12
|
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
13
13
|
JRUBY = defined?(JRUBY_VERSION)
|
14
|
-
IRONRUBY =
|
14
|
+
IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
|
15
15
|
WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
|
16
|
+
OS_X = Config::CONFIG['host_os'] =~ /darwin/
|
16
17
|
WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
|
17
18
|
RAILS = defined?(Rails)
|
18
19
|
RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
@@ -27,4 +28,4 @@ module Cucumber
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
self.use_full_backtrace = false
|
30
|
-
end
|
31
|
+
end
|
@@ -13,33 +13,14 @@ if defined?(ActiveRecord::Base)
|
|
13
13
|
|
14
14
|
Before do
|
15
15
|
if Cucumber::Rails::World.use_transactional_fixtures
|
16
|
-
|
17
|
-
ActiveRecord::Base.connection_handler.connection_pools.values.map {|pool| pool.connection}
|
18
|
-
else
|
19
|
-
[ActiveRecord::Base.connection] # Rails <= 2.1.2
|
20
|
-
end
|
21
|
-
@__cucumber_ar_connections.each do |__cucumber_ar_connection|
|
22
|
-
if __cucumber_ar_connection.respond_to?(:increment_open_transactions)
|
23
|
-
__cucumber_ar_connection.increment_open_transactions
|
24
|
-
else
|
25
|
-
ActiveRecord::Base.__send__(:increment_open_transactions)
|
26
|
-
end
|
27
|
-
__cucumber_ar_connection.begin_db_transaction
|
28
|
-
end
|
16
|
+
run_callbacks :setup if respond_to?(:run_callbacks)
|
29
17
|
end
|
30
18
|
ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
|
31
19
|
end
|
32
20
|
|
33
21
|
After do
|
34
22
|
if Cucumber::Rails::World.use_transactional_fixtures
|
35
|
-
|
36
|
-
__cucumber_ar_connection.rollback_db_transaction
|
37
|
-
if __cucumber_ar_connection.respond_to?(:decrement_open_transactions)
|
38
|
-
__cucumber_ar_connection.decrement_open_transactions
|
39
|
-
else
|
40
|
-
ActiveRecord::Base.__send__(:decrement_open_transactions)
|
41
|
-
end
|
42
|
-
end
|
23
|
+
run_callbacks :teardown if respond_to?(:run_callbacks)
|
43
24
|
end
|
44
25
|
end
|
45
26
|
else
|
data/lib/cucumber/rails/world.rb
CHANGED
@@ -8,13 +8,14 @@ end
|
|
8
8
|
require 'cucumber/rails/test_unit'
|
9
9
|
require 'cucumber/rails/action_controller'
|
10
10
|
|
11
|
-
|
11
|
+
if ::Rails.respond_to?(:configuration) && !(::Rails.configuration.cache_classes)
|
12
12
|
warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
|
13
13
|
end
|
14
14
|
|
15
15
|
module Cucumber #:nodoc:
|
16
16
|
module Rails
|
17
17
|
class World < ActionController::IntegrationTest
|
18
|
+
include ActiveSupport::Testing::SetupAndTeardown
|
18
19
|
def initialize #:nodoc:
|
19
20
|
@_result = Test::Unit::TestResult.new
|
20
21
|
end
|
@@ -2,6 +2,7 @@ module Cucumber
|
|
2
2
|
module RbSupport
|
3
3
|
# Wrapper for Before, After and AfterStep hooks
|
4
4
|
class RbHook
|
5
|
+
attr_accessor :tag_name_lists
|
5
6
|
attr_reader :tag_names
|
6
7
|
|
7
8
|
def initialize(rb_language, tag_names, proc)
|
@@ -15,4 +16,4 @@ module Cucumber
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
18
|
-
end
|
19
|
+
end
|
@@ -35,6 +35,7 @@ module Cucumber
|
|
35
35
|
@step_mother = step_mother
|
36
36
|
@step_definitions = []
|
37
37
|
RbDsl.rb_language = self
|
38
|
+
@world_proc = @world_modules = nil
|
38
39
|
end
|
39
40
|
|
40
41
|
# Tell the language about other i18n translations so that
|
@@ -87,13 +88,13 @@ module Cucumber
|
|
87
88
|
multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
|
88
89
|
end
|
89
90
|
|
90
|
-
"#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending\nend"
|
91
|
+
"#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending # express the regexp above with the code you wish you had\nend"
|
91
92
|
end
|
92
93
|
|
93
|
-
def begin_rb_scenario
|
94
|
+
def begin_rb_scenario(scenario)
|
94
95
|
create_world
|
95
96
|
extend_world
|
96
|
-
connect_world
|
97
|
+
connect_world(scenario)
|
97
98
|
end
|
98
99
|
|
99
100
|
def register_rb_hook(phase, tag_names, proc)
|
@@ -125,8 +126,8 @@ module Cucumber
|
|
125
126
|
|
126
127
|
protected
|
127
128
|
|
128
|
-
def begin_scenario
|
129
|
-
begin_rb_scenario
|
129
|
+
def begin_scenario(scenario)
|
130
|
+
begin_rb_scenario(scenario)
|
130
131
|
end
|
131
132
|
|
132
133
|
def end_scenario
|
@@ -155,8 +156,9 @@ module Cucumber
|
|
155
156
|
end
|
156
157
|
end
|
157
158
|
|
158
|
-
def connect_world
|
159
|
+
def connect_world(scenario)
|
159
160
|
@current_world.__cucumber_step_mother = @step_mother
|
161
|
+
@current_world.__natural_language = scenario.language
|
160
162
|
end
|
161
163
|
|
162
164
|
def check_nil(o, proc)
|
@@ -14,56 +14,35 @@ module Cucumber
|
|
14
14
|
rb.execute_transforms([arg]).first
|
15
15
|
end
|
16
16
|
|
17
|
-
attr_writer :__cucumber_step_mother
|
17
|
+
attr_writer :__cucumber_step_mother, :__natural_language
|
18
18
|
|
19
19
|
# Call a step from within a step definition. This method is aliased to
|
20
20
|
# the same i18n as RbDsl.
|
21
21
|
def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
|
22
|
-
|
23
|
-
@__cucumber_step_mother.invoke(name, multiline_argument)
|
24
|
-
rescue Exception => e
|
25
|
-
e.nested! if Undefined === e
|
26
|
-
raise e
|
27
|
-
end
|
22
|
+
@__cucumber_step_mother.invoke(name, multiline_argument)
|
28
23
|
end
|
29
24
|
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
#
|
36
|
-
# | CUC-101 | Peeler | 22 |
|
37
|
-
# })
|
38
|
-
#
|
39
|
-
# or a 2D Array:
|
40
|
-
#
|
41
|
-
# table([
|
42
|
-
# %w{ account description amount },
|
43
|
-
# %w{ INT-100 Taxi 114 },
|
44
|
-
# %w{ CUC-101 Peeler 22 }
|
45
|
-
# ])
|
46
|
-
#
|
25
|
+
# See StepMother#invoke_steps
|
26
|
+
def steps(steps_text)
|
27
|
+
@__cucumber_step_mother.invoke_steps(steps_text, @__natural_language)
|
28
|
+
end
|
29
|
+
|
30
|
+
# See StepMother#table
|
47
31
|
def table(text_or_table, file=nil, line_offset=0)
|
48
|
-
|
49
|
-
Ast::Table.new(text_or_table)
|
50
|
-
else
|
51
|
-
@table_parser ||= Parser::TableParser.new
|
52
|
-
@table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
|
53
|
-
end
|
32
|
+
@__cucumber_step_mother.table(text_or_table, file, line_offset)
|
54
33
|
end
|
55
34
|
|
56
|
-
#
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
#
|
62
|
-
# after it has run, so it can be coloured according to its status.
|
35
|
+
# See StepMother#py_string
|
36
|
+
def py_string(string_with_triple_quotes, file=nil, line_offset=0)
|
37
|
+
@__cucumber_step_mother.py_string(text_or_table, file, line_offset)
|
38
|
+
end
|
39
|
+
|
40
|
+
# See StepMother#announce
|
63
41
|
def announce(announcement)
|
64
42
|
@__cucumber_step_mother.announce(announcement)
|
65
43
|
end
|
66
44
|
|
45
|
+
# See StepMother#embed
|
67
46
|
def embed(file, mime_type)
|
68
47
|
@__cucumber_step_mother.embed(file, mime_type)
|
69
48
|
end
|
data/lib/cucumber/step_mother.rb
CHANGED
@@ -49,6 +49,7 @@ module Cucumber
|
|
49
49
|
@programming_languages = []
|
50
50
|
@language_map = {}
|
51
51
|
load_natural_language('en')
|
52
|
+
@current_scenario = nil
|
52
53
|
end
|
53
54
|
|
54
55
|
def load_plain_text_features(feature_files)
|
@@ -126,10 +127,21 @@ module Cucumber
|
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
129
|
-
|
130
|
+
# Output +announcement+ alongside the formatted output.
|
131
|
+
# This is an alternative to using Kernel#puts - it will display
|
132
|
+
# nicer, and in all outputs (in case you use several formatters)
|
133
|
+
#
|
134
|
+
# Beware that the output will be printed *before* the corresponding
|
135
|
+
# step. This is because the step itself will not be printed until
|
136
|
+
# after it has run, so it can be coloured according to its status.
|
137
|
+
#
|
138
|
+
def announce(msg)
|
130
139
|
@visitor.announce(msg)
|
131
140
|
end
|
132
141
|
|
142
|
+
# Embed +file+ of MIME type +mime_type+ into the output. This may or may
|
143
|
+
# not be ignored, depending on what kind of formatter(s) are active.
|
144
|
+
#
|
133
145
|
def embed(file, mime_type)
|
134
146
|
@visitor.embed(file, mime_type)
|
135
147
|
end
|
@@ -144,7 +156,79 @@ module Cucumber
|
|
144
156
|
end
|
145
157
|
|
146
158
|
def invoke(step_name, multiline_argument=nil)
|
147
|
-
|
159
|
+
begin
|
160
|
+
step_match(step_name).invoke(multiline_argument)
|
161
|
+
rescue Exception => e
|
162
|
+
e.nested! if Undefined === e
|
163
|
+
raise e
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Invokes a series of steps +steps_text+. Example:
|
168
|
+
#
|
169
|
+
# invoke(%Q{
|
170
|
+
# Given I have 8 cukes in my belly
|
171
|
+
# Then I should not be thirsty
|
172
|
+
# })
|
173
|
+
def invoke_steps(steps_text, natural_language)
|
174
|
+
ored_keywords = natural_language.step_keywords.join("|")
|
175
|
+
after_keyword = natural_language.space_after_keyword ? ' ' : ''
|
176
|
+
# TODO Gherkin:
|
177
|
+
# This a bit hacky and fragile. When we move to Gherkin we should replace this entire method body
|
178
|
+
# with a call to the parser - parsing the body of a scenario. We may need to put the parser/policy in the
|
179
|
+
# appropriate state (the same state it's in after parsing a Scenario: line).
|
180
|
+
steps_text.strip.split(/(?=^\s*(?:#{ored_keywords}))/).map { |step| step.strip }.each do |step|
|
181
|
+
output = step.match(/^\s*(#{ored_keywords})#{after_keyword}([^\n]+)(\n.*)?$/m)
|
182
|
+
|
183
|
+
action, step_name, table_or_string = output[1], output[2], output[3]
|
184
|
+
if table_or_string.to_s.strip =~ /^\|/
|
185
|
+
table_or_string = table(table_or_string)
|
186
|
+
elsif table_or_string.to_s.strip =~ /^"""/
|
187
|
+
table_or_string = py_string(table_or_string.gsub(/^\n/, ""))
|
188
|
+
end
|
189
|
+
args = [step_name, table_or_string].compact
|
190
|
+
invoke(*args)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# Returns a Cucumber::Ast::Table for +text_or_table+, which can either
|
195
|
+
# be a String:
|
196
|
+
#
|
197
|
+
# table(%{
|
198
|
+
# | account | description | amount |
|
199
|
+
# | INT-100 | Taxi | 114 |
|
200
|
+
# | CUC-101 | Peeler | 22 |
|
201
|
+
# })
|
202
|
+
#
|
203
|
+
# or a 2D Array:
|
204
|
+
#
|
205
|
+
# table([
|
206
|
+
# %w{ account description amount },
|
207
|
+
# %w{ INT-100 Taxi 114 },
|
208
|
+
# %w{ CUC-101 Peeler 22 }
|
209
|
+
# ])
|
210
|
+
#
|
211
|
+
def table(text_or_table, file=nil, line_offset=0)
|
212
|
+
if Array === text_or_table
|
213
|
+
Ast::Table.new(text_or_table)
|
214
|
+
else
|
215
|
+
@table_parser ||= Parser::TableParser.new
|
216
|
+
@table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# Returns a regular String for +string_with_triple_quotes+. Example:
|
221
|
+
#
|
222
|
+
# """
|
223
|
+
# hello
|
224
|
+
# world
|
225
|
+
# """
|
226
|
+
#
|
227
|
+
# Is retured as: " hello\nworld"
|
228
|
+
#
|
229
|
+
def py_string(string_with_triple_quotes, file=nil, line_offset=0)
|
230
|
+
@py_string_parser ||= Parser::PyStringParser.new
|
231
|
+
@py_string_parser.parse_or_fail(string_with_triple_quotes, file, line_offset).to_s
|
148
232
|
end
|
149
233
|
|
150
234
|
def step_match(step_name, name_to_report=nil) #:nodoc:
|
@@ -16,7 +16,9 @@ class CucumberGenerator < Rails::Generator::Base
|
|
16
16
|
:assigns => { :cucumber_version => ::Cucumber::VERSION }
|
17
17
|
|
18
18
|
m.gsub_file 'config/database.yml', /test:.*\n/, "test: &TEST\n"
|
19
|
-
|
19
|
+
unless File.read('config/database.yml').include? 'cucumber:'
|
20
|
+
m.gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *TEST"
|
21
|
+
end
|
20
22
|
|
21
23
|
m.directory 'features/support'
|
22
24
|
if spork?
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# This file was generated by
|
2
|
-
|
2
|
+
# Find vendored gem or plugin of cucumber
|
3
|
+
vendored_cucumber_dir = Dir["#{RAILS_ROOT}/vendor/{gems,plugins}/cucumber*"].first
|
4
|
+
$LOAD_PATH.unshift("#{vendored_cucumber_dir}/lib") unless vendored_cucumber_dir.nil?
|
3
5
|
|
4
6
|
unless ARGV.any? {|a| a =~ /^gems/}
|
5
7
|
|
@@ -8,7 +10,7 @@ begin
|
|
8
10
|
|
9
11
|
# Use vendored cucumber binary if possible. If it's not vendored,
|
10
12
|
# Cucumber::Rake::Task will automatically use installed gem's cucumber binary
|
11
|
-
vendored_cucumber_binary =
|
13
|
+
vendored_cucumber_binary = "#{vendored_cucumber_dir}/bin/cucumber" unless vendored_cucumber_dir.nil?
|
12
14
|
|
13
15
|
namespace :cucumber do
|
14
16
|
Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
|
@@ -8,31 +8,31 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "pat
|
|
8
8
|
# Commonly used webrat steps
|
9
9
|
# http://github.com/brynary/webrat
|
10
10
|
|
11
|
-
Given /^I am on (.+)$/ do |page_name|
|
11
|
+
Given /^(?:|I )am on (.+)$/ do |page_name|
|
12
12
|
visit path_to(page_name)
|
13
13
|
end
|
14
14
|
|
15
|
-
When /^I go to (.+)$/ do |page_name|
|
15
|
+
When /^(?:|I )go to (.+)$/ do |page_name|
|
16
16
|
visit path_to(page_name)
|
17
17
|
end
|
18
18
|
|
19
|
-
When /^I press "([^\"]*)"$/ do |button|
|
19
|
+
When /^(?:|I )press "([^\"]*)"$/ do |button|
|
20
20
|
click_button(button)
|
21
21
|
end
|
22
22
|
|
23
|
-
When /^I follow "([^\"]*)"$/ do |link|
|
23
|
+
When /^(?:|I )follow "([^\"]*)"$/ do |link|
|
24
24
|
click_link(link)
|
25
25
|
end
|
26
26
|
|
27
|
-
When /^I follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
|
27
|
+
When /^(?:|I )follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
|
28
28
|
click_link_within(parent, link)
|
29
29
|
end
|
30
30
|
|
31
|
-
When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
31
|
+
When /^(?:|I )fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
32
32
|
fill_in(field, :with => value)
|
33
33
|
end
|
34
34
|
|
35
|
-
When /^I fill in "([^\"]*)" for "([^\"]*)"$/ do |value, field|
|
35
|
+
When /^(?:|I )fill in "([^\"]*)" for "([^\"]*)"$/ do |value, field|
|
36
36
|
fill_in(field, :with => value)
|
37
37
|
end
|
38
38
|
|
@@ -47,19 +47,19 @@ end
|
|
47
47
|
# TODO: Add support for checkbox, select og option
|
48
48
|
# based on naming conventions.
|
49
49
|
#
|
50
|
-
When /^I fill in the following:$/ do |fields|
|
50
|
+
When /^(?:|I )fill in the following:$/ do |fields|
|
51
51
|
fields.rows_hash.each do |name, value|
|
52
52
|
When %{I fill in "#{name}" with "#{value}"}
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
|
56
|
+
When /^(?:|I )select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
|
57
57
|
select(value, :from => field)
|
58
58
|
end
|
59
59
|
|
60
60
|
# Use this step in conjunction with Rail's datetime_select helper. For example:
|
61
61
|
# When I select "December 25, 2008 10:00" as the date and time
|
62
|
-
When /^I select "([^\"]*)" as the date and time$/ do |time|
|
62
|
+
When /^(?:|I )select "([^\"]*)" as the date and time$/ do |time|
|
63
63
|
select_datetime(time)
|
64
64
|
end
|
65
65
|
|
@@ -72,7 +72,7 @@ end
|
|
72
72
|
# The following steps would fill out the form:
|
73
73
|
# When I select "November 23, 2004 11:20" as the "Preferred" date and time
|
74
74
|
# And I select "November 25, 2004 10:30" as the "Alternative" date and time
|
75
|
-
When /^I select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
|
75
|
+
When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
|
76
76
|
select_datetime(datetime, :from => datetime_label)
|
77
77
|
end
|
78
78
|
|
@@ -80,47 +80,47 @@ end
|
|
80
80
|
# When I select "2:20PM" as the time
|
81
81
|
# Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
|
82
82
|
# will convert the 2:20PM to 14:20 and then select it.
|
83
|
-
When /^I select "([^\"]*)" as the time$/ do |time|
|
83
|
+
When /^(?:|I )select "([^\"]*)" as the time$/ do |time|
|
84
84
|
select_time(time)
|
85
85
|
end
|
86
86
|
|
87
87
|
# Use this step when using multiple time_select helpers on a page or you want to
|
88
88
|
# specify the name of the time on the form. For example:
|
89
89
|
# When I select "7:30AM" as the "Gym" time
|
90
|
-
When /^I select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
|
90
|
+
When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
|
91
91
|
select_time(time, :from => time_label)
|
92
92
|
end
|
93
93
|
|
94
94
|
# Use this step in conjunction with Rail's date_select helper. For example:
|
95
95
|
# When I select "February 20, 1981" as the date
|
96
|
-
When /^I select "([^\"]*)" as the date$/ do |date|
|
96
|
+
When /^(?:|I )select "([^\"]*)" as the date$/ do |date|
|
97
97
|
select_date(date)
|
98
98
|
end
|
99
99
|
|
100
100
|
# Use this step when using multiple date_select helpers on one page or
|
101
101
|
# you want to specify the name of the date on the form. For example:
|
102
102
|
# When I select "April 26, 1982" as the "Date of Birth" date
|
103
|
-
When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
|
103
|
+
When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
|
104
104
|
select_date(date, :from => date_label)
|
105
105
|
end
|
106
106
|
|
107
|
-
When /^I check "([^\"]*)"$/ do |field|
|
107
|
+
When /^(?:|I )check "([^\"]*)"$/ do |field|
|
108
108
|
check(field)
|
109
109
|
end
|
110
110
|
|
111
|
-
When /^I uncheck "([^\"]*)"$/ do |field|
|
111
|
+
When /^(?:|I )uncheck "([^\"]*)"$/ do |field|
|
112
112
|
uncheck(field)
|
113
113
|
end
|
114
114
|
|
115
|
-
When /^I choose "([^\"]*)"$/ do |field|
|
115
|
+
When /^(?:|I )choose "([^\"]*)"$/ do |field|
|
116
116
|
choose(field)
|
117
117
|
end
|
118
118
|
|
119
|
-
When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
|
119
|
+
When /^(?:|I )attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
|
120
120
|
attach_file(field, path)
|
121
121
|
end
|
122
122
|
|
123
|
-
Then /^I should see "([^\"]*)"$/ do |text|
|
123
|
+
Then /^(?:|I )should see "([^\"]*)"$/ do |text|
|
124
124
|
<% if framework == :rspec -%>
|
125
125
|
response.should contain(text)
|
126
126
|
<% else -%>
|
@@ -128,7 +128,7 @@ Then /^I should see "([^\"]*)"$/ do |text|
|
|
128
128
|
<% end -%>
|
129
129
|
end
|
130
130
|
|
131
|
-
Then /^I should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
131
|
+
Then /^(?:|I )should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
132
132
|
within(selector) do |content|
|
133
133
|
<% if framework == :rspec -%>
|
134
134
|
content.should contain(text)
|
@@ -138,7 +138,7 @@ Then /^I should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
Then /^I should see \/([^\/]*)\/$/ do |regexp|
|
141
|
+
Then /^(?:|I )should see \/([^\/]*)\/$/ do |regexp|
|
142
142
|
regexp = Regexp.new(regexp)
|
143
143
|
<% if framework == :rspec -%>
|
144
144
|
response.should contain(regexp)
|
@@ -147,7 +147,7 @@ Then /^I should see \/([^\/]*)\/$/ do |regexp|
|
|
147
147
|
<% end -%>
|
148
148
|
end
|
149
149
|
|
150
|
-
Then /^I should see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
150
|
+
Then /^(?:|I )should see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
151
151
|
within(selector) do |content|
|
152
152
|
regexp = Regexp.new(regexp)
|
153
153
|
<% if framework == :rspec -%>
|
@@ -158,7 +158,7 @@ Then /^I should see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
Then /^I should not see "([^\"]*)"$/ do |text|
|
161
|
+
Then /^(?:|I )should not see "([^\"]*)"$/ do |text|
|
162
162
|
<% if framework == :rspec -%>
|
163
163
|
response.should_not contain(text)
|
164
164
|
<% else -%>
|
@@ -166,7 +166,7 @@ Then /^I should not see "([^\"]*)"$/ do |text|
|
|
166
166
|
<% end -%>
|
167
167
|
end
|
168
168
|
|
169
|
-
Then /^I should not see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
169
|
+
Then /^(?:|I )should not see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
170
170
|
within(selector) do |content|
|
171
171
|
<% if framework == :rspec -%>
|
172
172
|
content.should_not contain(text)
|
@@ -176,7 +176,7 @@ Then /^I should not see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
Then /^I should not see \/([^\/]*)\/$/ do |regexp|
|
179
|
+
Then /^(?:|I )should not see \/([^\/]*)\/$/ do |regexp|
|
180
180
|
regexp = Regexp.new(regexp)
|
181
181
|
<% if framework == :rspec -%>
|
182
182
|
response.should_not contain(regexp)
|
@@ -185,7 +185,7 @@ Then /^I should not see \/([^\/]*)\/$/ do |regexp|
|
|
185
185
|
<% end -%>
|
186
186
|
end
|
187
187
|
|
188
|
-
Then /^I should not see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
188
|
+
Then /^(?:|I )should not see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
189
189
|
within(selector) do |content|
|
190
190
|
regexp = Regexp.new(regexp)
|
191
191
|
<% if framework == :rspec -%>
|
@@ -228,7 +228,7 @@ Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
|
|
228
228
|
<% end -%>
|
229
229
|
end
|
230
230
|
|
231
|
-
Then /^I should be on (.+)$/ do |page_name|
|
231
|
+
Then /^(?:|I )should be on (.+)$/ do |page_name|
|
232
232
|
<% if framework == :rspec -%>
|
233
233
|
URI.parse(current_url).path.should == path_to(page_name)
|
234
234
|
<% else -%>
|