cucumber 1.2.5 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +14 -6
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +2 -2
- data/History.md +38 -2
- data/bin/cucumber +2 -11
- data/cucumber.gemspec +3 -3
- data/cucumber.yml +5 -1
- data/examples/test_unit/Gemfile +4 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
- data/examples/watir/README.textile +2 -2
- data/examples/watir/features/support/env.rb +10 -7
- data/features/.cucumber/stepdefs.json +747 -1354
- data/features/assertions.feature +6 -2
- data/features/background.feature +3 -0
- data/features/backtraces.feature +3 -3
- data/features/before_hook.feature +43 -0
- data/features/bootstrap.feature +14 -2
- data/features/custom_formatter.feature +1 -1
- data/features/drb_server_integration.feature +3 -3
- data/features/formatter_callbacks.feature +2 -2
- data/features/formatter_step_file_colon_line.feature +1 -1
- data/features/html_formatter.feature +52 -1
- data/features/json_formatter.feature +93 -7
- data/features/load_path.feature +14 -0
- data/features/nested_steps.feature +75 -3
- data/features/nested_steps_i18n.feature +36 -0
- data/features/pretty_formatter.feature +31 -0
- data/features/progress_formatter.feature +31 -0
- data/features/raketask.feature +51 -0
- data/features/rerun_formatter.feature +1 -1
- data/features/stats_formatters.feature +17 -14
- data/features/step_definitions/cucumber_steps.rb +6 -4
- data/features/support/env.rb +31 -4
- data/features/support/feature_factory.rb +17 -0
- data/features/tagged_hooks.feature +37 -195
- data/features/transforms.feature +15 -15
- data/gem_tasks/cucumber.rake +2 -0
- data/gem_tasks/yard.rake +10 -6
- data/legacy_features/README.md +14 -0
- data/legacy_features/language_help.feature +3 -1
- data/legacy_features/report_called_undefined_steps.feature +1 -0
- data/legacy_features/snippets_when_using_star_keyword.feature +1 -0
- data/legacy_features/support/env.rb +4 -0
- data/lib/cucumber/ast/background.rb +35 -35
- data/lib/cucumber/ast/empty_background.rb +33 -0
- data/lib/cucumber/ast/examples.rb +5 -2
- data/lib/cucumber/ast/feature.rb +24 -35
- data/lib/cucumber/ast/features.rb +4 -1
- data/lib/cucumber/ast/has_steps.rb +9 -17
- data/lib/cucumber/ast/location.rb +41 -0
- data/lib/cucumber/ast/scenario.rb +37 -50
- data/lib/cucumber/ast/scenario_outline.rb +62 -49
- data/lib/cucumber/ast/step.rb +23 -27
- data/lib/cucumber/ast/step_collection.rb +16 -0
- data/lib/cucumber/ast/step_invocation.rb +4 -1
- data/lib/cucumber/ast/tree_walker.rb +7 -0
- data/lib/cucumber/cli/configuration.rb +15 -3
- data/lib/cucumber/cli/main.rb +24 -11
- data/lib/cucumber/cli/options.rb +24 -16
- data/lib/cucumber/configuration.rb +4 -0
- data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +10 -34
- data/lib/cucumber/core_ext/instance_exec.rb +4 -1
- data/lib/cucumber/core_ext/proc.rb +2 -0
- data/lib/cucumber/feature_file.rb +5 -12
- data/lib/cucumber/formatter/console.rb +10 -0
- data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +4 -4
- data/lib/cucumber/formatter/html.rb +7 -42
- data/lib/cucumber/formatter/interceptor.rb +4 -0
- data/lib/cucumber/formatter/json_pretty.rb +0 -4
- data/lib/cucumber/formatter/junit.rb +8 -2
- data/lib/cucumber/formatter/pretty.rb +5 -1
- data/lib/cucumber/formatter/progress.rb +4 -0
- data/lib/cucumber/formatter/unicode.rb +12 -25
- data/lib/cucumber/formatter/usage.rb +7 -2
- data/lib/cucumber/js_support/js_snippets.rb +1 -1
- data/lib/cucumber/load_path.rb +13 -0
- data/lib/cucumber/parser/gherkin_builder.rb +237 -81
- data/lib/cucumber/platform.rb +1 -1
- data/lib/cucumber/py_support/py_language.rb +1 -1
- data/lib/cucumber/rake/task.rb +5 -1
- data/lib/cucumber/rb_support/rb_language.rb +20 -19
- data/lib/cucumber/rb_support/rb_world.rb +63 -21
- data/lib/cucumber/rb_support/snippet.rb +108 -0
- data/lib/cucumber/runtime.rb +1 -0
- data/lib/cucumber/runtime/support_code.rb +2 -2
- data/lib/cucumber/unit.rb +11 -0
- data/lib/cucumber/wire_support/wire_language.rb +1 -1
- data/spec/cucumber/ast/background_spec.rb +13 -6
- data/spec/cucumber/ast/feature_factory.rb +20 -10
- data/spec/cucumber/ast/features_spec.rb +51 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +13 -7
- data/spec/cucumber/ast/step_spec.rb +6 -4
- data/spec/cucumber/cli/configuration_spec.rb +34 -1
- data/spec/cucumber/cli/main_spec.rb +36 -26
- data/spec/cucumber/cli/options_spec.rb +28 -19
- data/spec/cucumber/core_ext/proc_spec.rb +13 -1
- data/spec/cucumber/formatter/interceptor_spec.rb +8 -0
- data/spec/cucumber/formatter/junit_spec.rb +33 -0
- data/spec/cucumber/formatter/pretty_spec.rb +391 -0
- data/spec/cucumber/rb_support/rb_language_spec.rb +21 -50
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +2 -4
- data/spec/cucumber/rb_support/snippet_spec.rb +128 -0
- data/spec/cucumber/step_match_spec.rb +2 -6
- metadata +62 -113
- data/.rvmrc +0 -1
- data/features/hooks.feature +0 -59
- data/legacy_features/call_steps_from_stepdefs.feature +0 -154
@@ -1,10 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
require 'cucumber/core_ext/proc'
|
3
4
|
|
4
5
|
describe Proc do
|
5
6
|
it "should remove extraneous path info for file" do
|
6
7
|
proc = lambda {|a,b|}
|
7
|
-
proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:
|
8
|
+
proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:7/
|
9
|
+
end
|
10
|
+
|
11
|
+
unless Cucumber::RUBY_1_8_7
|
12
|
+
it "should work with non-English path" do
|
13
|
+
proc = lambda {|a,b|}
|
14
|
+
def proc.to_s
|
15
|
+
"#<Proc:0x00000003c04740@#{Dir.pwd}/å/spec/cucumber/core_ext/proc_spec.rb:12 (lambda)>".force_encoding('ASCII-8BIT')
|
16
|
+
end
|
17
|
+
|
18
|
+
proc.file_colon_line.force_encoding('UTF-8').should =~ /^å\/spec\/cucumber\/core_ext\/proc_spec\.rb:12/
|
19
|
+
end
|
8
20
|
end
|
9
21
|
|
10
22
|
it "should raise ArityMismatchError for too many args (expecting 0)" do
|
@@ -117,5 +117,13 @@ module Cucumber::Formatter
|
|
117
117
|
pi.tty?.should be true
|
118
118
|
end
|
119
119
|
end
|
120
|
+
|
121
|
+
describe '#respond_to' do
|
122
|
+
let(:pi) { Interceptor::Pipe.wrap(:stderr) }
|
123
|
+
|
124
|
+
it 'should respond to all methods $stderr has' do
|
125
|
+
$stderr.methods.each { |m| pi.respond_to?(m).should be true }
|
126
|
+
end
|
127
|
+
end
|
120
128
|
end
|
121
129
|
end
|
@@ -23,6 +23,39 @@ module Cucumber::Formatter
|
|
23
23
|
@formatter = TestDoubleJunitFormatter.new(step_mother, '', {})
|
24
24
|
end
|
25
25
|
|
26
|
+
describe "should be able to strip control chars from cdata" do
|
27
|
+
before(:each) do
|
28
|
+
run_defined_feature
|
29
|
+
@doc = Nokogiri.XML(@formatter.written_files.values.first)
|
30
|
+
end
|
31
|
+
define_feature "
|
32
|
+
Feature: One passing scenario, one failing scenario
|
33
|
+
|
34
|
+
Scenario: Passing
|
35
|
+
Given a passing ctrl scenario
|
36
|
+
"
|
37
|
+
class Junit
|
38
|
+
def before_step(step)
|
39
|
+
if step.name.match("a passing ctrl scenario")
|
40
|
+
Interceptor::Pipe.unwrap! :stdout
|
41
|
+
@fake_io = $stdout = StringIO.new
|
42
|
+
$stdout.sync = true
|
43
|
+
@interceptedout = Interceptor::Pipe.wrap(:stdout)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def after_step(step)
|
48
|
+
if step.name.match("a passing ctrl scenario")
|
49
|
+
@interceptedout.write("boo\b\cx\e\a\f boo ")
|
50
|
+
$stdout = STDOUT
|
51
|
+
@fake_io.close
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it { @doc.xpath('//testsuite/system-out').first.content.should match(/\s+boo boo\s+/) }
|
57
|
+
end
|
58
|
+
|
26
59
|
describe "a feature with no name" do
|
27
60
|
define_feature <<-FEATURE
|
28
61
|
Feature:
|
@@ -0,0 +1,391 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'cucumber/formatter/spec_helper'
|
3
|
+
require 'cucumber/formatter/pretty'
|
4
|
+
require 'cucumber/cli/options'
|
5
|
+
|
6
|
+
module Cucumber
|
7
|
+
module Formatter
|
8
|
+
describe Pretty do
|
9
|
+
extend SpecHelperDsl
|
10
|
+
include SpecHelper
|
11
|
+
|
12
|
+
context "With no options" do
|
13
|
+
before(:each) do
|
14
|
+
Cucumber::Term::ANSIColor.coloring = false
|
15
|
+
@out = StringIO.new
|
16
|
+
@formatter = Pretty.new(step_mother, @out, {})
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "given a single feature" do
|
20
|
+
before(:each) do
|
21
|
+
run_defined_feature
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "basic feature" do
|
25
|
+
define_feature <<-FEATURE
|
26
|
+
Feature: Bananas
|
27
|
+
In order to find my inner monkey
|
28
|
+
As a human
|
29
|
+
I must eat bananas
|
30
|
+
FEATURE
|
31
|
+
|
32
|
+
it "prints out the feature description" do
|
33
|
+
@out.string.should include "Feature: Bananas"
|
34
|
+
@out.string.should include "I must eat bananas"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "with a scenario" do
|
40
|
+
define_feature <<-FEATURE
|
41
|
+
Feature: Banana party
|
42
|
+
|
43
|
+
Scenario: Monkey eats banana
|
44
|
+
Given there are bananas
|
45
|
+
FEATURE
|
46
|
+
|
47
|
+
it "outputs the scenario name" do
|
48
|
+
@out.string.should include "Scenario: Monkey eats banana"
|
49
|
+
end
|
50
|
+
it "outputs the step" do
|
51
|
+
@out.string.should include "Given there are bananas"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "with a scenario outline" do
|
56
|
+
define_feature <<-FEATURE
|
57
|
+
Feature: Fud Pyramid
|
58
|
+
|
59
|
+
Scenario Outline: Monkey eats a balanced diet
|
60
|
+
Given there are <Things>
|
61
|
+
|
62
|
+
Examples: Fruit
|
63
|
+
| Things |
|
64
|
+
| apples |
|
65
|
+
| bananas |
|
66
|
+
Examples: Vegetables
|
67
|
+
| Things |
|
68
|
+
| broccoli |
|
69
|
+
| carrots |
|
70
|
+
FEATURE
|
71
|
+
|
72
|
+
it "outputs the scenario outline" do
|
73
|
+
lines = <<-OUTPUT
|
74
|
+
Examples: Fruit
|
75
|
+
| Things |
|
76
|
+
| apples |
|
77
|
+
| bananas |
|
78
|
+
Examples: Vegetables
|
79
|
+
| Things |
|
80
|
+
| broccoli |
|
81
|
+
| carrots |
|
82
|
+
OUTPUT
|
83
|
+
lines.split("\n").each do |line|
|
84
|
+
@out.string.should include line.strip
|
85
|
+
end
|
86
|
+
end
|
87
|
+
it "has 4 undefined scenarios" do
|
88
|
+
@out.string.should include "4 scenarios (4 undefined)"
|
89
|
+
end
|
90
|
+
it "has 4 undefined steps" do
|
91
|
+
@out.string.should include "4 steps (4 undefined)"
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "with a step with a py string" do
|
97
|
+
define_feature <<-FEATURE
|
98
|
+
Feature: Traveling circus
|
99
|
+
|
100
|
+
Scenario: Monkey goes to town
|
101
|
+
Given there is a monkey called:
|
102
|
+
"""
|
103
|
+
foo
|
104
|
+
"""
|
105
|
+
FEATURE
|
106
|
+
|
107
|
+
it "displays the pystring nested" do
|
108
|
+
@out.string.should include <<OUTPUT
|
109
|
+
"""
|
110
|
+
foo
|
111
|
+
"""
|
112
|
+
OUTPUT
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "with a multiline step arg" do
|
117
|
+
define_feature <<-FEATURE
|
118
|
+
Feature: Traveling circus
|
119
|
+
|
120
|
+
Scenario: Monkey goes to town
|
121
|
+
Given there are monkeys:
|
122
|
+
| name |
|
123
|
+
| foo |
|
124
|
+
| bar |
|
125
|
+
FEATURE
|
126
|
+
|
127
|
+
it "displays the multiline string" do
|
128
|
+
@out.string.should include <<OUTPUT
|
129
|
+
Given there are monkeys:
|
130
|
+
| name |
|
131
|
+
| foo |
|
132
|
+
| bar |
|
133
|
+
OUTPUT
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "with a table in the background and the scenario" do
|
138
|
+
define_feature <<-FEATURE
|
139
|
+
Feature: accountant monkey
|
140
|
+
|
141
|
+
Background:
|
142
|
+
Given table:
|
143
|
+
| a | b |
|
144
|
+
| c | d |
|
145
|
+
Scenario:
|
146
|
+
Given another table:
|
147
|
+
| e | f |
|
148
|
+
| g | h |
|
149
|
+
FEATURE
|
150
|
+
|
151
|
+
it "displays the table for the background" do
|
152
|
+
@out.string.should include <<OUTPUT
|
153
|
+
Given table:
|
154
|
+
| a | b |
|
155
|
+
| c | d |
|
156
|
+
OUTPUT
|
157
|
+
end
|
158
|
+
it "displays the table for the scenario" do
|
159
|
+
@out.string.should include <<OUTPUT
|
160
|
+
Given another table:
|
161
|
+
| e | f |
|
162
|
+
| g | h |
|
163
|
+
OUTPUT
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "with a py string in the background and the scenario" do
|
168
|
+
define_feature <<-FEATURE
|
169
|
+
Feature: py strings
|
170
|
+
|
171
|
+
Background:
|
172
|
+
Given stuff:
|
173
|
+
"""
|
174
|
+
foo
|
175
|
+
"""
|
176
|
+
Scenario:
|
177
|
+
Given more stuff:
|
178
|
+
"""
|
179
|
+
bar
|
180
|
+
"""
|
181
|
+
FEATURE
|
182
|
+
|
183
|
+
it "displays the background py string" do
|
184
|
+
@out.string.should include <<OUTPUT
|
185
|
+
Given stuff:
|
186
|
+
"""
|
187
|
+
foo
|
188
|
+
"""
|
189
|
+
OUTPUT
|
190
|
+
end
|
191
|
+
it "displays the scenario py string" do
|
192
|
+
@out.string.should include <<OUTPUT
|
193
|
+
Given more stuff:
|
194
|
+
"""
|
195
|
+
bar
|
196
|
+
"""
|
197
|
+
OUTPUT
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context "With --no-multiline passed as an option" do
|
204
|
+
before(:each) do
|
205
|
+
Cucumber::Term::ANSIColor.coloring = false
|
206
|
+
@out = StringIO.new
|
207
|
+
@formatter = Pretty.new(step_mother, @out, {:no_multiline => true})
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "given a single feature" do
|
211
|
+
before(:each) do
|
212
|
+
run_defined_feature
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "basic feature" do
|
216
|
+
define_feature <<-FEATURE
|
217
|
+
Feature: Bananas
|
218
|
+
In order to find my inner monkey
|
219
|
+
As a human
|
220
|
+
I must eat bananas
|
221
|
+
FEATURE
|
222
|
+
|
223
|
+
it "prints out the feature description" do
|
224
|
+
@out.string.should include "Feature: Bananas"
|
225
|
+
@out.string.should include "I must eat bananas"
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "with a scenario" do
|
231
|
+
define_feature <<-FEATURE
|
232
|
+
Feature: Banana party
|
233
|
+
|
234
|
+
Scenario: Monkey eats banana
|
235
|
+
Given there are bananas
|
236
|
+
FEATURE
|
237
|
+
|
238
|
+
it "outputs the scenario name" do
|
239
|
+
@out.string.should include "Scenario: Monkey eats banana"
|
240
|
+
end
|
241
|
+
it "outputs the step" do
|
242
|
+
@out.string.should include "Given there are bananas"
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
describe "with a scenario outline" do
|
247
|
+
define_feature <<-FEATURE
|
248
|
+
Feature: Fud Pyramid
|
249
|
+
|
250
|
+
Scenario Outline: Monkey eats a balanced diet
|
251
|
+
Given there are <Things>
|
252
|
+
|
253
|
+
Examples: Fruit
|
254
|
+
| Things |
|
255
|
+
| apples |
|
256
|
+
| bananas |
|
257
|
+
Examples: Vegetables
|
258
|
+
| Things |
|
259
|
+
| broccoli |
|
260
|
+
| carrots |
|
261
|
+
FEATURE
|
262
|
+
|
263
|
+
it "outputs the scenario outline" do
|
264
|
+
lines = <<-OUTPUT
|
265
|
+
Examples: Fruit
|
266
|
+
| Things |
|
267
|
+
| apples |
|
268
|
+
| bananas |
|
269
|
+
Examples: Vegetables
|
270
|
+
| Things |
|
271
|
+
| broccoli |
|
272
|
+
| carrots |
|
273
|
+
OUTPUT
|
274
|
+
lines.split("\n").each do |line|
|
275
|
+
@out.string.should include line.strip
|
276
|
+
end
|
277
|
+
end
|
278
|
+
it "has 4 undefined scenarios" do
|
279
|
+
@out.string.should include "4 scenarios (4 undefined)"
|
280
|
+
end
|
281
|
+
it "has 4 undefined steps" do
|
282
|
+
@out.string.should include "4 steps (4 undefined)"
|
283
|
+
end
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
describe "with a step with a py string" do
|
288
|
+
define_feature <<-FEATURE
|
289
|
+
Feature: Traveling circus
|
290
|
+
|
291
|
+
Scenario: Monkey goes to town
|
292
|
+
Given there is a monkey called:
|
293
|
+
"""
|
294
|
+
foo
|
295
|
+
"""
|
296
|
+
FEATURE
|
297
|
+
|
298
|
+
it "does not display the pystring" do
|
299
|
+
@out.string.should_not include <<OUTPUT
|
300
|
+
"""
|
301
|
+
foo
|
302
|
+
"""
|
303
|
+
OUTPUT
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
describe "with a multiline step arg" do
|
308
|
+
define_feature <<-FEATURE
|
309
|
+
Feature: Traveling circus
|
310
|
+
|
311
|
+
Scenario: Monkey goes to town
|
312
|
+
Given there are monkeys:
|
313
|
+
| name |
|
314
|
+
| foo |
|
315
|
+
| bar |
|
316
|
+
FEATURE
|
317
|
+
|
318
|
+
it "does not display the multiline string" do
|
319
|
+
@out.string.should_not include <<OUTPUT
|
320
|
+
| name |
|
321
|
+
| foo |
|
322
|
+
| bar |
|
323
|
+
OUTPUT
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
describe "with a table in the background and the scenario" do
|
328
|
+
define_feature <<-FEATURE
|
329
|
+
Feature: accountant monkey
|
330
|
+
|
331
|
+
Background:
|
332
|
+
Given table:
|
333
|
+
| a | b |
|
334
|
+
| c | d |
|
335
|
+
Scenario:
|
336
|
+
Given another table:
|
337
|
+
| e | f |
|
338
|
+
| g | h |
|
339
|
+
FEATURE
|
340
|
+
|
341
|
+
it "does not display the table for the background" do
|
342
|
+
@out.string.should_not include <<OUTPUT
|
343
|
+
| a | b |
|
344
|
+
| c | d |
|
345
|
+
OUTPUT
|
346
|
+
end
|
347
|
+
it "does not display the table for the scenario" do
|
348
|
+
@out.string.should_not include <<OUTPUT
|
349
|
+
| e | f |
|
350
|
+
| g | h |
|
351
|
+
OUTPUT
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
describe "with a py string in the background and the scenario" do
|
356
|
+
define_feature <<-FEATURE
|
357
|
+
Feature: py strings
|
358
|
+
|
359
|
+
Background:
|
360
|
+
Given stuff:
|
361
|
+
"""
|
362
|
+
foo
|
363
|
+
"""
|
364
|
+
Scenario:
|
365
|
+
Given more stuff:
|
366
|
+
"""
|
367
|
+
bar
|
368
|
+
"""
|
369
|
+
FEATURE
|
370
|
+
|
371
|
+
it "does not display the background py string" do
|
372
|
+
@out.string.should_not include <<OUTPUT
|
373
|
+
"""
|
374
|
+
foo
|
375
|
+
"""
|
376
|
+
OUTPUT
|
377
|
+
end
|
378
|
+
it "does not display the scenario py string" do
|
379
|
+
@out.string.should_not include <<OUTPUT
|
380
|
+
"""
|
381
|
+
bar
|
382
|
+
"""
|
383
|
+
OUTPUT
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|