square-cucumber 0.3.12.2 → 0.3.93.1
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 +117 -4
- data/Manifest.txt +11 -0
- data/Rakefile +1 -1
- data/config/hoe.rb +3 -2
- data/cucumber.yml +2 -2
- data/examples/i18n/ko/features/addition.feature +5 -5
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +1 -1
- data/examples/i18n/pt/features/adicao.feature +4 -4
- data/examples/self_test/features/support/env.rb +2 -1
- data/examples/sinatra/features/support/env.rb +7 -1
- data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
- data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +15 -0
- data/examples/tickets/features/table_diffing.feature +13 -0
- data/examples/watir/features/step_definitons/search_steps.rb +5 -1
- data/features/cucumber_cli_diff_disabled.feature +2 -1
- data/features/html_formatter/a.html +5 -7
- data/features/junit_formatter.feature +21 -14
- data/features/profiles.feature +99 -0
- data/features/rake_task.feature +28 -0
- data/features/step_definitions/cucumber_steps.rb +28 -15
- data/features/steps_formatter.feature +25 -0
- data/features/support/env.rb +9 -5
- data/features/table_diffing.feature +45 -0
- data/features/unicode_table.feature +35 -0
- data/features/work_in_progress.feature +1 -0
- data/gem_tasks/contributors.rake +4 -0
- data/lib/cucumber/ast/background.rb +1 -0
- data/lib/cucumber/ast/comment.rb +1 -0
- data/lib/cucumber/ast/examples.rb +1 -0
- data/lib/cucumber/ast/feature.rb +10 -0
- data/lib/cucumber/ast/features.rb +6 -1
- data/lib/cucumber/ast/outline_table.rb +4 -1
- data/lib/cucumber/ast/py_string.rb +1 -1
- data/lib/cucumber/ast/scenario.rb +1 -0
- data/lib/cucumber/ast/scenario_outline.rb +2 -0
- data/lib/cucumber/ast/step.rb +5 -1
- data/lib/cucumber/ast/step_collection.rb +1 -0
- data/lib/cucumber/ast/step_invocation.rb +1 -0
- data/lib/cucumber/ast/table.rb +306 -52
- data/lib/cucumber/ast/tags.rb +1 -0
- data/lib/cucumber/ast/visitor.rb +2 -1
- data/lib/cucumber/cli/configuration.rb +28 -278
- data/lib/cucumber/cli/drb_client.rb +3 -1
- data/lib/cucumber/cli/language_help_formatter.rb +9 -7
- data/lib/cucumber/cli/main.rb +16 -2
- data/lib/cucumber/cli/options.rb +370 -0
- data/lib/cucumber/cli/profile_loader.rb +65 -0
- data/lib/cucumber/core_ext/instance_exec.rb +8 -5
- data/lib/cucumber/feature_file.rb +7 -1
- data/lib/cucumber/filter.rb +2 -2
- data/lib/cucumber/formatter/ansicolor.rb +42 -9
- data/lib/cucumber/formatter/console.rb +1 -1
- data/lib/cucumber/formatter/html.rb +12 -10
- data/lib/cucumber/formatter/junit.rb +63 -26
- data/lib/cucumber/formatter/pretty.rb +20 -5
- data/lib/cucumber/formatter/progress.rb +1 -1
- data/lib/cucumber/formatter/steps.rb +49 -0
- data/lib/cucumber/languages.yml +6 -6
- data/lib/cucumber/parser/feature.rb +90 -63
- data/lib/cucumber/parser/feature.tt +28 -1
- data/lib/cucumber/parser/i18n/language.rb +12 -5
- data/lib/cucumber/parser/table.rb +25 -25
- data/lib/cucumber/rake/task.rb +9 -3
- data/lib/cucumber/step_definition.rb +1 -1
- data/lib/cucumber/step_match.rb +1 -1
- data/lib/cucumber/step_mother.rb +3 -1
- data/lib/cucumber/version.rb +2 -2
- data/lib/cucumber/webrat/table_locator.rb +66 -0
- data/rails_generators/cucumber/cucumber_generator.rb +5 -1
- data/rails_generators/cucumber/templates/cucumber +3 -2
- data/rails_generators/cucumber/templates/cucumber.rake +18 -6
- data/rails_generators/cucumber/templates/cucumber_environment.rb +7 -4
- data/rails_generators/cucumber/templates/env.rb +1 -0
- data/rails_generators/cucumber/templates/spork_env.rb +1 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +22 -0
- data/rails_generators/feature/templates/feature.erb +1 -1
- data/rails_generators/feature/templates/steps.erb +2 -8
- data/spec/cucumber/ast/table_spec.rb +169 -0
- data/spec/cucumber/cli/configuration_spec.rb +144 -101
- data/spec/cucumber/cli/main_spec.rb +14 -5
- data/spec/cucumber/cli/options_spec.rb +311 -0
- data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
- data/spec/cucumber/core_ext/proc_spec.rb +16 -2
- data/spec/cucumber/formatter/html_spec.rb +18 -0
- data/spec/cucumber/formatter/progress_spec.rb +2 -2
- data/spec/cucumber/parser/table_parser_spec.rb +1 -1
- data/spec/spec.opts +3 -1
- metadata +18 -4
- data/lib/cucumber/webrat/mechanize_world.rb +0 -82
@@ -20,7 +20,7 @@ class CucumberGenerator < Rails::Generator::Base
|
|
20
20
|
|
21
21
|
m.directory 'features/support'
|
22
22
|
|
23
|
-
if
|
23
|
+
if spork?
|
24
24
|
m.template 'spork_env.rb', 'features/support/env.rb'
|
25
25
|
else
|
26
26
|
m.template 'env.rb', 'features/support/env.rb'
|
@@ -40,6 +40,10 @@ class CucumberGenerator < Rails::Generator::Base
|
|
40
40
|
def framework
|
41
41
|
options[:framework] || :rspec
|
42
42
|
end
|
43
|
+
|
44
|
+
def spork?
|
45
|
+
options[:spork]
|
46
|
+
end
|
43
47
|
|
44
48
|
protected
|
45
49
|
|
@@ -3,6 +3,7 @@ begin
|
|
3
3
|
load File.expand_path(File.dirname(__FILE__) + "/../vendor/plugins/cucumber/bin/cucumber")
|
4
4
|
rescue LoadError => e
|
5
5
|
raise unless e.to_s =~ /cucumber/
|
6
|
-
require
|
7
|
-
|
6
|
+
require 'rubygems'
|
7
|
+
require 'cucumber'
|
8
|
+
load Cucumber::BINARY
|
8
9
|
end
|
@@ -4,15 +4,27 @@ unless ARGV.any? {|a| a =~ /^gems/}
|
|
4
4
|
|
5
5
|
begin
|
6
6
|
require 'cucumber/rake/task'
|
7
|
+
namespace :cucumber do
|
8
|
+
Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass (no @wip tag)') do |t|
|
9
|
+
t.fork = true # You may get faster startup if you set this to false
|
10
|
+
t.cucumber_opts = "--tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}<%= spork? ? ' --drb' : '' %>"
|
11
|
+
end
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
13
|
+
Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run @wip features (not passing yet)') do |t|
|
14
|
+
t.fork = true # You may get faster startup if you set this to false
|
15
|
+
t.cucumber_opts = "--tags @wip --wip --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}<%= spork? ? ' --drb' : '' %>"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Run all features'
|
19
|
+
task :all => [:ok, :wip]
|
20
|
+
end
|
21
|
+
|
22
|
+
task :features => 'cucumber:ok' do
|
23
|
+
STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
|
11
24
|
end
|
12
|
-
task :features => 'db:test:prepare'
|
13
25
|
rescue LoadError
|
14
|
-
desc '
|
15
|
-
task :
|
26
|
+
desc 'cucumber rake task not available (cucumber not installed)'
|
27
|
+
task :cucumber do
|
16
28
|
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
|
17
29
|
end
|
18
30
|
end
|
@@ -15,9 +15,12 @@ config.action_controller.allow_forgery_protection = false
|
|
15
15
|
# ActionMailer::Base.deliveries array.
|
16
16
|
config.action_mailer.delivery_method = :test
|
17
17
|
|
18
|
-
config.gem
|
19
|
-
config.gem
|
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.4.4' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
|
20
20
|
<% if framework == :rspec -%>
|
21
|
-
config.gem
|
22
|
-
config.gem
|
21
|
+
config.gem 'rspec', :lib => false, :version => '>=1.2.6' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec'))
|
22
|
+
config.gem 'rspec-rails', :lib => 'spec/rails', :version => '>=1.2.6' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
|
23
|
+
<% end %>
|
24
|
+
<% if spork? -%>
|
25
|
+
config.gem 'spork', :lib => false, :version => '>=0.5.7' unless File.directory?(File.join(Rails.root, 'vendor/plugins/spork'))
|
23
26
|
<% end %>
|
@@ -7,6 +7,7 @@ Spork.prefork do
|
|
7
7
|
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
|
8
8
|
|
9
9
|
require 'webrat'
|
10
|
+
require 'cucumber/webrat/table_locator' # Lets you do table.diff!(table_at('#my_table').to_a)
|
10
11
|
|
11
12
|
Webrat.configure do |config|
|
12
13
|
config.mode = :rails
|
@@ -19,6 +19,10 @@ When /^I follow "([^\"]*)"$/ do |link|
|
|
19
19
|
click_link(link)
|
20
20
|
end
|
21
21
|
|
22
|
+
When /^I follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
|
23
|
+
click_link_within(parent, link)
|
24
|
+
end
|
25
|
+
|
22
26
|
When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
23
27
|
fill_in(field, :with => value)
|
24
28
|
end
|
@@ -98,6 +102,15 @@ Then /^I should see "([^\"]*)"$/ do |text|
|
|
98
102
|
<% end -%>
|
99
103
|
end
|
100
104
|
|
105
|
+
Then /^I should see \/([^\/]*)\/$/ do |regexp|
|
106
|
+
regexp = Regexp.new(regexp)
|
107
|
+
<% if framework == :rspec -%>
|
108
|
+
response.should contain(regexp)
|
109
|
+
<% else -%>
|
110
|
+
assert_contain regexp
|
111
|
+
<% end -%>
|
112
|
+
end
|
113
|
+
|
101
114
|
Then /^I should not see "([^\"]*)"$/ do |text|
|
102
115
|
<% if framework == :rspec -%>
|
103
116
|
response.should_not contain(text)
|
@@ -106,6 +119,15 @@ Then /^I should not see "([^\"]*)"$/ do |text|
|
|
106
119
|
<% end -%>
|
107
120
|
end
|
108
121
|
|
122
|
+
Then /^I should not see \/([^\/]*)\/$/ do |regexp|
|
123
|
+
regexp = Regexp.new(regexp)
|
124
|
+
<% if framework == :rspec -%>
|
125
|
+
response.should_not contain(regexp)
|
126
|
+
<% else -%>
|
127
|
+
assert_not_contain regexp
|
128
|
+
<% end -%>
|
129
|
+
end
|
130
|
+
|
109
131
|
Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
|
110
132
|
<% if framework == :rspec -%>
|
111
133
|
field_labeled(field).value.should =~ /#{value}/
|
@@ -25,7 +25,7 @@ Feature: Manage <%= plural_name %>
|
|
25
25
|
<% end -%>
|
26
26
|
When I delete the 3rd <%= singular_name %>
|
27
27
|
Then I should see the following <%= plural_name %>:
|
28
|
-
|<%= named_args.map
|
28
|
+
|<%= named_args.map{|arg| arg.name.humanize}.join('|') %>|
|
29
29
|
<% [1,2,4].each do |n| -%>
|
30
30
|
|<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
|
31
31
|
<% end -%>
|
@@ -9,12 +9,6 @@ When /^I delete the (\d+)(?:st|nd|rd|th) <%= singular_name %>$/ do |pos|
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
Then /^I should see the following <%= plural_name %>:$/ do
|
13
|
-
<%= plural_name
|
14
|
-
row.each_with_index do |cell, j|
|
15
|
-
response.should have_selector("table > tr:nth-child(#{i+2}) > td:nth-child(#{j+1})") { |td|
|
16
|
-
td.inner_text.should == cell
|
17
|
-
}
|
18
|
-
end
|
19
|
-
end
|
12
|
+
Then /^I should see the following <%= plural_name %>:$/ do |expected_<%= plural_name %>_table|
|
13
|
+
expected_<%= plural_name %>_table.diff!(table_at('table').to_a)
|
20
14
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
3
|
require 'cucumber/ast/table'
|
3
4
|
|
@@ -100,6 +101,11 @@ module Cucumber
|
|
100
101
|
table2.hashes.first[:three].should == '4444'
|
101
102
|
end
|
102
103
|
|
104
|
+
it "should allow renaming columns using regexp" do
|
105
|
+
table2 = @table.map_headers(/one|uno/ => :three)
|
106
|
+
table2.hashes.first[:three].should == '4444'
|
107
|
+
end
|
108
|
+
|
103
109
|
it "should copy column mappings when mapping headers" do
|
104
110
|
@table.map_column!('one') { |v| v.to_i }
|
105
111
|
table2 = @table.map_headers('one' => 'three')
|
@@ -168,6 +174,169 @@ module Cucumber
|
|
168
174
|
|
169
175
|
end
|
170
176
|
|
177
|
+
describe "diff!" do
|
178
|
+
it "should detect a complex diff" do
|
179
|
+
t1 = table(%{
|
180
|
+
| 1 | 22 | 333 | 4444 |
|
181
|
+
| 55555 | 666666 | 7777777 | 88888888 |
|
182
|
+
| 999999999 | 0000000000 | 01010101010 | 121212121212 |
|
183
|
+
| 4000 | ABC | DEF | 50000 |
|
184
|
+
})
|
185
|
+
|
186
|
+
t2 = table(%{
|
187
|
+
| a | 4444 | 1 |
|
188
|
+
| bb | 88888888 | 55555 |
|
189
|
+
| ccc | xxxxxxxx | 999999999 |
|
190
|
+
| dddd | 4000 | 300 |
|
191
|
+
| e | 50000 | 4000 |
|
192
|
+
})
|
193
|
+
lambda{t1.diff!(t2)}.should raise_error
|
194
|
+
t1.to_s(:indent => 12, :color => false).should == %{
|
195
|
+
| 1 | (-) 22 | (-) 333 | 4444 | (+) a |
|
196
|
+
| 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
|
197
|
+
| (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
|
198
|
+
| (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
|
199
|
+
| (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
|
200
|
+
| 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
|
201
|
+
}
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should not change table when diffed with identical" do
|
205
|
+
t = table(%{
|
206
|
+
|a|b|c|
|
207
|
+
|d|e|f|
|
208
|
+
|g|h|i|
|
209
|
+
})
|
210
|
+
t.diff!(t.dup)
|
211
|
+
t.to_s(:indent => 12, :color => false).should == %{
|
212
|
+
| a | b | c |
|
213
|
+
| d | e | f |
|
214
|
+
| g | h | i |
|
215
|
+
}
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should inspect missing and surplus cells" do
|
219
|
+
t1 = Table.new([
|
220
|
+
['name', 'male', 'lastname', 'swedish'],
|
221
|
+
['aslak', 'true', 'hellesøy', 'false']
|
222
|
+
])
|
223
|
+
t2 = Table.new([
|
224
|
+
['name', 'male', 'lastname', 'swedish'],
|
225
|
+
['aslak', true, 'hellesøy', false]
|
226
|
+
])
|
227
|
+
lambda{t1.diff!(t2)}.should raise_error
|
228
|
+
t1.to_s(:indent => 12, :color => false).should == %{
|
229
|
+
| name | male | lastname | swedish |
|
230
|
+
| (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
|
231
|
+
| (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
|
232
|
+
}
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should allow column mapping of target before diffing" do
|
236
|
+
t1 = Table.new([
|
237
|
+
['name', 'male'],
|
238
|
+
['aslak', 'true']
|
239
|
+
])
|
240
|
+
t1.map_column!('male') { |m| m == 'true' }
|
241
|
+
t2 = Table.new([
|
242
|
+
['name', 'male'],
|
243
|
+
['aslak', true]
|
244
|
+
])
|
245
|
+
t1.diff!(t2)
|
246
|
+
t1.to_s(:indent => 12, :color => false).should == %{
|
247
|
+
| name | male |
|
248
|
+
| aslak | true |
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should allow column mapping of argument before diffing" do
|
253
|
+
t1 = Table.new([
|
254
|
+
['name', 'male'],
|
255
|
+
['aslak', true]
|
256
|
+
])
|
257
|
+
t1.map_column!('male') {
|
258
|
+
'true'
|
259
|
+
}
|
260
|
+
t2 = Table.new([
|
261
|
+
['name', 'male'],
|
262
|
+
['aslak', 'true']
|
263
|
+
])
|
264
|
+
t2.diff!(t1)
|
265
|
+
t1.to_s(:indent => 12, :color => false).should == %{
|
266
|
+
| name | male |
|
267
|
+
| aslak | true |
|
268
|
+
}
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should allow header mapping before diffing" do
|
272
|
+
t1 = Table.new([
|
273
|
+
['Name', 'Male'],
|
274
|
+
['aslak', 'true']
|
275
|
+
])
|
276
|
+
t1.map_headers!('Name' => 'name', 'Male' => 'male')
|
277
|
+
t1.map_column!('male') { |m| m == 'true' }
|
278
|
+
t2 = Table.new([
|
279
|
+
['name', 'male'],
|
280
|
+
['aslak', true]
|
281
|
+
])
|
282
|
+
t1.diff!(t2)
|
283
|
+
t1.to_s(:indent => 12, :color => false).should == %{
|
284
|
+
| name | male |
|
285
|
+
| aslak | true |
|
286
|
+
}
|
287
|
+
end
|
288
|
+
|
289
|
+
describe "raising" do
|
290
|
+
before do
|
291
|
+
@t = table(%{
|
292
|
+
| a | b |
|
293
|
+
| c | d |
|
294
|
+
})
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should raise on missing rows" do
|
298
|
+
t = table(%{
|
299
|
+
| a | b |
|
300
|
+
})
|
301
|
+
lambda { @t.dup.diff!(t) }.should raise_error
|
302
|
+
lambda { @t.dup.diff!(t, :missing_row => false) }.should_not raise_error
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should raise on surplus rows" do
|
306
|
+
t = table(%{
|
307
|
+
| a | b |
|
308
|
+
| c | d |
|
309
|
+
| e | f |
|
310
|
+
})
|
311
|
+
lambda { @t.dup.diff!(t) }.should raise_error
|
312
|
+
lambda { @t.dup.diff!(t, :surplus_row => false) }.should_not raise_error
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should raise on missing columns" do
|
316
|
+
t = table(%{
|
317
|
+
| a |
|
318
|
+
| c |
|
319
|
+
})
|
320
|
+
lambda { @t.dup.diff!(t) }.should raise_error
|
321
|
+
lambda { @t.dup.diff!(t, :missing_col => false) }.should_not raise_error
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should not raise on surplus columns" do
|
325
|
+
t = table(%{
|
326
|
+
| a | b | x |
|
327
|
+
| c | d | y |
|
328
|
+
})
|
329
|
+
lambda { @t.dup.diff!(t) }.should_not raise_error
|
330
|
+
lambda { @t.dup.diff!(t, :surplus_col => true) }.should raise_error
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
def table(text, file=nil, line_offset=0)
|
335
|
+
@table_parser ||= Parser::TableParser.new
|
336
|
+
@table_parser.parse_or_fail(text.strip, file, line_offset)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
171
340
|
it "should convert to sexp" do
|
172
341
|
@table.to_sexp.should ==
|
173
342
|
[:table,
|
@@ -17,13 +17,25 @@ module Cli
|
|
17
17
|
end
|
18
18
|
|
19
19
|
before(:each) do
|
20
|
+
#given_cucumber_yml_defined_as({'default' => '-q'})
|
21
|
+
File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
|
20
22
|
Kernel.stub!(:exit).and_return(nil)
|
21
23
|
end
|
22
24
|
|
25
|
+
def config
|
26
|
+
@config ||= Configuration.new(@out = StringIO.new, @error = StringIO.new)
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset_config
|
30
|
+
@config = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :out, :error
|
34
|
+
|
35
|
+
|
23
36
|
it "should require files in support paths first" do
|
24
37
|
given_the_following_files("/features/step_definitions/foo.rb","/features/support/bar.rb")
|
25
38
|
|
26
|
-
config = Configuration.new(StringIO.new)
|
27
39
|
config.parse!(%w{--require /features})
|
28
40
|
|
29
41
|
config.files_to_require.should == [
|
@@ -35,7 +47,6 @@ module Cli
|
|
35
47
|
it "should require env.rb files first" do
|
36
48
|
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
37
49
|
|
38
|
-
config = Configuration.new(StringIO.new)
|
39
50
|
config.parse!(%w{--require /features})
|
40
51
|
|
41
52
|
config.files_to_require.should == [
|
@@ -47,7 +58,6 @@ module Cli
|
|
47
58
|
it "should not require env.rb files when --dry-run" do
|
48
59
|
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
49
60
|
|
50
|
-
config = Configuration.new(StringIO.new)
|
51
61
|
config.parse!(%w{--require /features --dry-run})
|
52
62
|
|
53
63
|
config.files_to_require.should == [
|
@@ -55,12 +65,23 @@ module Cli
|
|
55
65
|
]
|
56
66
|
end
|
57
67
|
|
68
|
+
it "should require files in vendor/{plugins,gems}/*/cucumber/*.rb" do
|
69
|
+
given_the_following_files("/vendor/plugins/plugin_a/cucumber/foo.rb",
|
70
|
+
"/vendor/gems/gem_a/cucumber/bar.rb")
|
71
|
+
|
72
|
+
config.parse!(%w{--require /features})
|
73
|
+
|
74
|
+
config.files_to_require.should == [
|
75
|
+
"/vendor/plugins/plugin_a/cucumber/foo.rb",
|
76
|
+
"/vendor/gems/gem_a/cucumber/bar.rb"
|
77
|
+
]
|
78
|
+
end
|
79
|
+
|
58
80
|
describe "--exclude" do
|
59
81
|
|
60
82
|
it "excludes a ruby file from requiring when the name matches exactly" do
|
61
83
|
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
62
84
|
|
63
|
-
config = Configuration.new(StringIO.new)
|
64
85
|
config.parse!(%w{--require /features --exclude a_file.rb})
|
65
86
|
|
66
87
|
config.files_to_require.should == [
|
@@ -73,7 +94,6 @@ module Cli
|
|
73
94
|
"/features/support/food.rb","/features/blah.rb",
|
74
95
|
"/features/support/fooz.rb")
|
75
96
|
|
76
|
-
config = Configuration.new(StringIO.new)
|
77
97
|
config.parse!(%w{--require /features --exclude foo[df] --exclude blah})
|
78
98
|
|
79
99
|
config.files_to_require.should == [
|
@@ -85,29 +105,23 @@ module Cli
|
|
85
105
|
|
86
106
|
describe '#drb?' do
|
87
107
|
it "indicates whether the --drb flag was passed in or not" do
|
88
|
-
config = Configuration.new(StringIO.new)
|
89
|
-
|
90
108
|
config.parse!(%w{features})
|
91
|
-
config.
|
109
|
+
config.should_not be_drb
|
92
110
|
|
93
111
|
|
94
112
|
config.parse!(%w{features --drb})
|
95
|
-
config.
|
113
|
+
config.should be_drb
|
96
114
|
end
|
97
115
|
end
|
98
116
|
|
99
117
|
context '--drb' do
|
100
118
|
it "removes the --drb flag from the args" do
|
101
|
-
config = Configuration.new(StringIO.new)
|
102
|
-
|
103
119
|
args = %w{features --drb}
|
104
120
|
config.parse!(args)
|
105
121
|
args.should == %w{features}
|
106
122
|
end
|
107
123
|
|
108
124
|
it "keeps all other flags intact" do
|
109
|
-
config = Configuration.new(StringIO.new)
|
110
|
-
|
111
125
|
args = %w{features --drb --format profile}
|
112
126
|
config.parse!(args)
|
113
127
|
args.should == %w{features --format profile}
|
@@ -118,7 +132,6 @@ module Cli
|
|
118
132
|
context '--drb in a profile' do
|
119
133
|
it "removes the --drb flag from the args" do
|
120
134
|
given_cucumber_yml_defined_as({'server' => '--drb features'})
|
121
|
-
config = Configuration.new(StringIO.new)
|
122
135
|
|
123
136
|
args = %w{--profile server}
|
124
137
|
config.parse!(args)
|
@@ -129,11 +142,9 @@ module Cli
|
|
129
142
|
given_cucumber_yml_defined_as({'server' => '--drb features --profile nested',
|
130
143
|
'nested' => '--verbose'})
|
131
144
|
|
132
|
-
config = Configuration.new(StringIO.new)
|
133
|
-
|
134
145
|
args = %w{--profile server --format profile}
|
135
146
|
config.parse!(args)
|
136
|
-
args.should == %w{features --verbose
|
147
|
+
args.should == %w{--format profile features --verbose}
|
137
148
|
end
|
138
149
|
|
139
150
|
end
|
@@ -141,35 +152,40 @@ module Cli
|
|
141
152
|
context '--drb in the default profile and no arguments specified' do
|
142
153
|
it "expands the profile's arguments into the args excpet for --drb" do
|
143
154
|
given_cucumber_yml_defined_as({'default' => '--drb features --format pretty'})
|
144
|
-
config = Configuration.new(StringIO.new)
|
145
155
|
args = []
|
146
156
|
config.parse!(args)
|
147
157
|
args.should == %w{features --format pretty}
|
148
158
|
end
|
149
159
|
end
|
150
160
|
|
151
|
-
it "
|
152
|
-
given_cucumber_yml_defined_as({'
|
161
|
+
it "uses the default profile when no profile is defined" do
|
162
|
+
given_cucumber_yml_defined_as({'default' => '--require some_file'})
|
153
163
|
|
154
|
-
config
|
155
|
-
config.
|
156
|
-
config.options[:formats].should == [['progress', STDOUT]]
|
157
|
-
config.options[:require].should == ['from/yml']
|
164
|
+
config.parse!(%w{--format progress})
|
165
|
+
config.options[:require].should include('some_file')
|
158
166
|
end
|
159
167
|
|
160
|
-
|
161
|
-
given_cucumber_yml_defined_as({'default' => '--require from/yml'})
|
168
|
+
context '--profile' do
|
162
169
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
170
|
+
it "expands args from profiles in the cucumber.yml file" do
|
171
|
+
given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
|
172
|
+
|
173
|
+
config.parse!(%w{--format progress --profile bongo})
|
174
|
+
config.options[:formats].should == [['progress', out]]
|
175
|
+
config.options[:require].should == ['from/yml']
|
176
|
+
end
|
167
177
|
|
168
|
-
|
169
|
-
|
178
|
+
it "expands args from the default profile when no flags are provided" do
|
179
|
+
given_cucumber_yml_defined_as({'default' => '--require from/yml'})
|
180
|
+
|
181
|
+
config.parse!([])
|
182
|
+
config.options[:require].should == ['from/yml']
|
183
|
+
end
|
170
184
|
|
171
|
-
|
172
|
-
|
185
|
+
it "provides a helpful error message when a specified profile does not exists in cucumber.yml" do
|
186
|
+
given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
|
187
|
+
|
188
|
+
expected_message = <<-END_OF_MESSAGE
|
173
189
|
Could not find profile: 'i_do_not_exist'
|
174
190
|
|
175
191
|
Defined profiles in cucumber.yml:
|
@@ -177,141 +193,175 @@ Defined profiles in cucumber.yml:
|
|
177
193
|
* html_report
|
178
194
|
END_OF_MESSAGE
|
179
195
|
|
180
|
-
|
181
|
-
|
196
|
+
lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(ProfileNotFound, expected_message)
|
197
|
+
end
|
182
198
|
|
183
|
-
|
184
|
-
|
199
|
+
it "allows profiles to be defined in arrays" do
|
200
|
+
given_cucumber_yml_defined_as({'foo' => [1,2,3]})
|
185
201
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
end
|
202
|
+
config.parse!(%w{--profile foo})
|
203
|
+
config.paths.should == [1,2,3]
|
204
|
+
end
|
190
205
|
|
191
|
-
|
192
|
-
|
193
|
-
given_cucumber_yml_defined_as({'foo' => bad_input})
|
206
|
+
it "notifies the user that an individual profile is being used" do
|
207
|
+
given_cucumber_yml_defined_as({'foo' => [1,2,3]})
|
194
208
|
|
195
|
-
config
|
196
|
-
|
197
|
-
lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
|
209
|
+
config.parse!(%w{--profile foo})
|
210
|
+
out.string.should =~ /Using the foo profile...\n/
|
198
211
|
end
|
199
|
-
end
|
200
212
|
|
201
|
-
|
202
|
-
|
213
|
+
it "notifies the user when multiple profiles are being used" do
|
214
|
+
given_cucumber_yml_defined_as({'foo' => [1,2,3], 'bar' => ['v'], 'dog' => ['v']})
|
203
215
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
216
|
+
config.parse!(%w{--profile foo --profile bar})
|
217
|
+
out.string.should =~ /Using the foo and bar profiles...\n/
|
218
|
+
|
219
|
+
reset_config
|
208
220
|
|
209
|
-
|
210
|
-
|
221
|
+
config.parse!(%w{--profile foo --profile bar --profile dog})
|
222
|
+
out.string.should =~ /Using the foo, bar and dog profiles...\n/
|
223
|
+
end
|
211
224
|
|
212
|
-
|
213
|
-
given_cucumber_yml_defined_as(
|
225
|
+
it "disregards paths in profiles when other paths are passed in (via cmd line)" do
|
226
|
+
given_cucumber_yml_defined_as({'foo' => %w[-v features]})
|
214
227
|
|
215
|
-
config
|
216
|
-
|
228
|
+
config.parse!(%w{--profile foo features/specific.feature --format pretty})
|
229
|
+
config.paths.should == ['features/specific.feature']
|
230
|
+
end
|
231
|
+
|
232
|
+
it "disregards default STDOUT formatter defined in profile when another is passed in (via cmd line)" do
|
233
|
+
given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
|
234
|
+
config.parse!(%w{--format progress --profile foo})
|
235
|
+
config.options[:formats].should == [['progress', out]]#, ['pretty', 'pretty.txt']]
|
236
|
+
end
|
237
|
+
|
238
|
+
|
239
|
+
|
240
|
+
["--no-profile", "-P"].each do |flag|
|
241
|
+
|
242
|
+
context 'when none is specified with #{flag}' do
|
243
|
+
|
244
|
+
it "disables profiles" do
|
245
|
+
given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
|
246
|
+
|
247
|
+
config.parse!("#{flag} --require some_file.rb".split(" "))
|
248
|
+
config.options[:require].should == ['some_file.rb']
|
249
|
+
end
|
250
|
+
|
251
|
+
it "notifies the user that the profiles are being disabled" do
|
252
|
+
given_cucumber_yml_defined_as({'default' => '-v'})
|
253
|
+
|
254
|
+
config.parse!("#{flag} --require some_file.rb".split(" "))
|
255
|
+
out.string.should =~ /Disabling profiles.../
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
end
|
261
|
+
|
262
|
+
|
263
|
+
|
264
|
+
it "issues a helpful error message when a specified profile exists but is nil or blank" do
|
265
|
+
[nil, ' '].each do |bad_input|
|
266
|
+
given_cucumber_yml_defined_as({'foo' => bad_input})
|
267
|
+
|
268
|
+
expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
|
269
|
+
lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
it "issues a helpful error message when no YAML file exists and a profile is specified" do
|
274
|
+
File.should_receive(:exist?).with('cucumber.yml').and_return(false)
|
275
|
+
|
276
|
+
expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
|
277
|
+
lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
|
278
|
+
end
|
279
|
+
|
280
|
+
it "issues a helpful error message when cucumber.yml is blank or malformed" do
|
281
|
+
expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
|
282
|
+
|
283
|
+
['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
|
284
|
+
given_cucumber_yml_defined_as(bad_input)
|
285
|
+
lambda{config.parse!([])}.should raise_error(expected_error_message)
|
286
|
+
reset_config
|
287
|
+
end
|
217
288
|
end
|
218
|
-
end
|
219
289
|
|
220
|
-
|
221
|
-
|
290
|
+
it "issues a helpful error message when cucumber.yml can not be parsed" do
|
291
|
+
expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
|
222
292
|
|
223
|
-
|
224
|
-
|
293
|
+
given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
|
294
|
+
YAML.should_receive(:load).and_raise ArgumentError
|
225
295
|
|
226
|
-
|
227
|
-
|
296
|
+
lambda{config.parse!([])}.should raise_error(expected_error_message)
|
297
|
+
end
|
228
298
|
end
|
229
299
|
|
300
|
+
|
230
301
|
it "should accept --dry-run option" do
|
231
|
-
config = Configuration.new(StringIO.new)
|
232
302
|
config.parse!(%w{--dry-run})
|
233
303
|
config.options[:dry_run].should be_true
|
234
304
|
end
|
235
305
|
|
236
306
|
it "should accept --no-source option" do
|
237
|
-
config = Configuration.new
|
238
307
|
config.parse!(%w{--no-source})
|
239
308
|
|
240
309
|
config.options[:source].should be_false
|
241
310
|
end
|
242
311
|
|
243
312
|
it "should accept --no-snippets option" do
|
244
|
-
config = Configuration.new
|
245
313
|
config.parse!(%w{--no-snippets})
|
246
314
|
|
247
315
|
config.options[:snippets].should be_false
|
248
316
|
end
|
249
317
|
|
250
318
|
it "should set snippets and source to false with --quiet option" do
|
251
|
-
config = Configuration.new
|
252
319
|
config.parse!(%w{--quiet})
|
253
320
|
|
254
|
-
config.options[:snippets].should
|
255
|
-
config.options[:source].should
|
321
|
+
config.options[:snippets].should be_false
|
322
|
+
config.options[:source].should be_false
|
256
323
|
end
|
257
324
|
|
258
325
|
it "should accept --verbose option" do
|
259
|
-
config = Configuration.new
|
260
326
|
config.parse!(%w{--verbose})
|
261
327
|
|
262
328
|
config.options[:verbose].should be_true
|
263
329
|
end
|
264
330
|
|
265
331
|
it "should accept --out option" do
|
266
|
-
config = Configuration.new(StringIO.new)
|
267
332
|
config.parse!(%w{--out jalla.txt})
|
268
333
|
config.options[:formats].should == [['pretty', 'jalla.txt']]
|
269
334
|
end
|
270
335
|
|
271
336
|
it "should accept multiple --out options" do
|
272
|
-
config = Configuration.new(StringIO.new)
|
273
337
|
config.parse!(%w{--format progress --out file1 --out file2})
|
274
338
|
config.options[:formats].should == [['progress', 'file2']]
|
275
339
|
end
|
276
340
|
|
277
341
|
it "should accept multiple --format options and put the STDOUT one first so progress is seen" do
|
278
|
-
io = StringIO.new
|
279
|
-
config = Configuration.new(io)
|
280
342
|
config.parse!(%w{--format pretty --out pretty.txt --format progress})
|
281
|
-
config.options[:formats].should == [['progress',
|
343
|
+
config.options[:formats].should == [['progress', out], ['pretty', 'pretty.txt']]
|
282
344
|
end
|
283
345
|
|
284
346
|
it "should not accept multiple --format options when both use implicit STDOUT" do
|
285
|
-
io = StringIO.new
|
286
|
-
config = Configuration.new(io)
|
287
347
|
lambda do
|
288
348
|
config.parse!(%w{--format pretty --format progress})
|
289
349
|
end.should raise_error("All but one formatter must use --out, only one can print to STDOUT")
|
290
350
|
end
|
291
351
|
|
292
352
|
it "should associate --out to previous --format" do
|
293
|
-
config = Configuration.new(StringIO.new)
|
294
353
|
config.parse!(%w{--format progress --out file1 --format profile --out file2})
|
295
354
|
config.options[:formats].should == [["progress", "file1"], ["profile" ,"file2"]]
|
296
355
|
end
|
297
356
|
|
298
357
|
it "should accept --color option" do
|
299
358
|
Term::ANSIColor.should_receive(:coloring=).with(true)
|
300
|
-
config = Configuration.new(StringIO.new)
|
301
359
|
config.parse!(['--color'])
|
302
360
|
end
|
303
361
|
|
304
362
|
it "should accept --no-color option" do
|
305
363
|
Term::ANSIColor.should_receive(:coloring=).with(false)
|
306
|
-
config
|
307
|
-
config.parse!(['--no-color'])
|
308
|
-
end
|
309
|
-
|
310
|
-
it "should parse tags" do
|
311
|
-
config = Configuration.new(nil)
|
312
|
-
includes, excludes = config.parse_tags("one,~two,@three,~@four")
|
313
|
-
includes.should == ['one', 'three']
|
314
|
-
excludes.should == ['two', 'four']
|
364
|
+
config.parse!(%w[--no-color])
|
315
365
|
end
|
316
366
|
|
317
367
|
describe "--backtrace" do
|
@@ -336,12 +386,10 @@ END_OF_MESSAGE
|
|
336
386
|
describe "diff output" do
|
337
387
|
|
338
388
|
it "is enabled by default" do
|
339
|
-
config = Configuration.new
|
340
389
|
config.diff_enabled?.should be_true
|
341
390
|
end
|
342
391
|
|
343
392
|
it "is disabled when the --no-diff option is supplied" do
|
344
|
-
config = Configuration.new
|
345
393
|
config.parse!(%w{--no-diff})
|
346
394
|
|
347
395
|
config.diff_enabled?.should be_false
|
@@ -350,7 +398,6 @@ END_OF_MESSAGE
|
|
350
398
|
end
|
351
399
|
|
352
400
|
it "should accept multiple --name options" do
|
353
|
-
config = Configuration.new
|
354
401
|
config.parse!(['--name', "User logs in", '--name', "User signs up"])
|
355
402
|
|
356
403
|
config.options[:name_regexps].should include(/User logs in/)
|
@@ -358,7 +405,6 @@ END_OF_MESSAGE
|
|
358
405
|
end
|
359
406
|
|
360
407
|
it "should accept multiple -n options" do
|
361
|
-
config = Configuration.new
|
362
408
|
config.parse!(['-n', "User logs in", '-n', "User signs up"])
|
363
409
|
|
364
410
|
config.options[:name_regexps].should include(/User logs in/)
|
@@ -370,22 +416,19 @@ END_OF_MESSAGE
|
|
370
416
|
Dir.should_receive(:[]).with("feature_directory/**/*.feature").
|
371
417
|
any_number_of_times.and_return(["cucumber.feature"])
|
372
418
|
|
373
|
-
config = Configuration.new(StringIO)
|
374
419
|
config.parse!(%w{feature_directory/})
|
375
420
|
|
376
421
|
config.feature_files.should == ["cucumber.feature"]
|
377
422
|
end
|
378
423
|
|
379
424
|
it "should allow specifying environment variables on the command line" do
|
380
|
-
config = Configuration.new
|
381
425
|
config.parse!(["foo=bar"])
|
382
426
|
ENV["foo"].should == "bar"
|
383
427
|
config.feature_files.should == []
|
384
428
|
end
|
385
|
-
|
429
|
+
|
386
430
|
it "should allow specifying environment variables in profiles" do
|
387
431
|
given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
|
388
|
-
config = Configuration.new
|
389
432
|
config.parse!(["--profile", "selenium"])
|
390
433
|
ENV["RAILS_ENV"].should == "selenium"
|
391
434
|
config.feature_files.should == []
|