aslakhellesoy-cucumber 0.3.103 → 0.3.104
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +27 -2
- data/Manifest.txt +10 -4
- data/examples/ramaze/README.textile +7 -0
- data/examples/ramaze/Rakefile +6 -0
- data/examples/ramaze/app.rb +21 -0
- data/examples/ramaze/features/add.feature +11 -0
- data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
- data/examples/ramaze/features/support/env.rb +32 -0
- data/examples/ramaze/layout/default.html.erb +8 -0
- data/examples/ramaze/view/index.html.erb +5 -0
- data/examples/sinatra/features/support/env.rb +1 -1
- data/features/cucumber_cli.feature +5 -5
- data/features/usage_and_stepdefs_formatter.feature +169 -0
- data/lib/cucumber/ast/step_invocation.rb +7 -0
- data/lib/cucumber/ast/tags.rb +6 -1
- data/lib/cucumber/ast/tree_walker.rb +179 -0
- data/lib/cucumber/cli/options.rb +20 -11
- data/lib/cucumber/formatter/html.rb +0 -2
- data/lib/cucumber/formatter/stepdefs.rb +14 -0
- data/lib/cucumber/formatter/usage.rb +106 -50
- data/lib/cucumber/language_support/language_methods.rb +6 -9
- data/lib/cucumber/rb_support/rb_language.rb +16 -3
- data/lib/cucumber/rb_support/rb_step_definition.rb +7 -1
- data/lib/cucumber/step_match.rb +4 -0
- data/lib/cucumber/step_mother.rb +8 -37
- data/lib/cucumber/version.rb +1 -1
- data/spec/cucumber/ast/background_spec.rb +0 -6
- data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
- data/spec/cucumber/cli/options_spec.rb +12 -0
- data/spec/cucumber/formatter/html_spec.rb +0 -1
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -9
- data/spec/cucumber/step_mother_spec.rb +13 -34
- metadata +14 -6
- data/features/steps_formatter.feature +0 -26
- data/features/usage.feature +0 -126
- data/lib/cucumber/formatter/profile.rb +0 -78
- data/lib/cucumber/formatters/unicode.rb +0 -7
@@ -1,6 +1,12 @@
|
|
1
|
+
require 'cucumber/step_match'
|
2
|
+
|
1
3
|
module Cucumber
|
2
4
|
module LanguageSupport
|
3
5
|
module LanguageMethods
|
6
|
+
def create_step_match(step_definition, step_name, formatted_step_name, step_arguments)
|
7
|
+
StepMatch.new(step_definition, step_name, formatted_step_name, step_arguments)
|
8
|
+
end
|
9
|
+
|
4
10
|
def before(scenario)
|
5
11
|
begin_scenario
|
6
12
|
execute_before(scenario)
|
@@ -41,15 +47,6 @@ module Cucumber
|
|
41
47
|
transform
|
42
48
|
end
|
43
49
|
|
44
|
-
def add_step_definition(step_definition)
|
45
|
-
step_definitions << step_definition
|
46
|
-
step_definition
|
47
|
-
end
|
48
|
-
|
49
|
-
def step_definitions
|
50
|
-
@step_definitions ||= []
|
51
|
-
end
|
52
|
-
|
53
50
|
def hooks_for(phase, scenario) #:nodoc:
|
54
51
|
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
55
52
|
end
|
@@ -34,6 +34,7 @@ module Cucumber
|
|
34
34
|
|
35
35
|
def initialize(step_mother)
|
36
36
|
@step_mother = step_mother
|
37
|
+
@step_definitions = []
|
37
38
|
RbDsl.rb_language = self
|
38
39
|
end
|
39
40
|
|
@@ -56,10 +57,20 @@ module Cucumber
|
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
60
|
+
def step_matches(step_name, formatted_step_name)
|
61
|
+
@step_definitions.map do |step_definition|
|
62
|
+
step_definition.step_match(step_name, formatted_step_name)
|
63
|
+
end.compact
|
64
|
+
end
|
65
|
+
|
59
66
|
def arguments_from(regexp, step_name)
|
60
67
|
@regexp_argument_matcher.arguments_from(regexp, step_name)
|
61
68
|
end
|
62
69
|
|
70
|
+
def unmatched_step_definitions
|
71
|
+
@step_definitions.select{|step_definition| !step_definition.matched?}
|
72
|
+
end
|
73
|
+
|
63
74
|
def snippet_text(step_keyword, step_name, multiline_arg_class = nil)
|
64
75
|
escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
|
65
76
|
escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
|
@@ -94,7 +105,9 @@ module Cucumber
|
|
94
105
|
end
|
95
106
|
|
96
107
|
def register_rb_step_definition(regexp, proc)
|
97
|
-
|
108
|
+
step_definition = RbStepDefinition.new(self, regexp, proc)
|
109
|
+
@step_definitions << step_definition
|
110
|
+
step_definition
|
98
111
|
end
|
99
112
|
|
100
113
|
def build_rb_world_factory(world_modules, proc)
|
@@ -106,12 +119,12 @@ module Cucumber
|
|
106
119
|
@world_modules += world_modules
|
107
120
|
end
|
108
121
|
|
109
|
-
protected
|
110
|
-
|
111
122
|
def load_code_file(code_file)
|
112
123
|
require code_file # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
|
113
124
|
end
|
114
125
|
|
126
|
+
protected
|
127
|
+
|
115
128
|
def begin_scenario
|
116
129
|
begin_rb_scenario
|
117
130
|
end
|
@@ -42,7 +42,9 @@ module Cucumber
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def arguments_from(step_name)
|
45
|
-
RegexpArgumentMatcher.arguments_from(@regexp, step_name)
|
45
|
+
args = RegexpArgumentMatcher.arguments_from(@regexp, step_name)
|
46
|
+
@matched = true if args
|
47
|
+
args
|
46
48
|
end
|
47
49
|
|
48
50
|
def invoke(args)
|
@@ -56,6 +58,10 @@ module Cucumber
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
61
|
+
def matched?
|
62
|
+
@matched
|
63
|
+
end
|
64
|
+
|
59
65
|
def file_colon_line
|
60
66
|
@proc.file_colon_line
|
61
67
|
end
|
data/lib/cucumber/step_match.rb
CHANGED
data/lib/cucumber/step_mother.rb
CHANGED
@@ -38,16 +38,6 @@ module Cucumber
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
# Raised when 2 or more StepDefinition have the same Regexp
|
42
|
-
class Redundant < StandardError
|
43
|
-
def initialize(step_def_1, step_def_2)
|
44
|
-
message = "Multiple step definitions have the same Regexp:\n\n"
|
45
|
-
message << step_def_1.backtrace_line << "\n"
|
46
|
-
message << step_def_2.backtrace_line << "\n\n"
|
47
|
-
super(message)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
41
|
# This is the meaty part of Cucumber that ties everything together.
|
52
42
|
class StepMother
|
53
43
|
include Constantize
|
@@ -87,17 +77,12 @@ module Cucumber
|
|
87
77
|
def load_code_file(step_def_file)
|
88
78
|
if programming_language = programming_language_for(step_def_file)
|
89
79
|
log.debug(" * #{step_def_file}\n")
|
90
|
-
|
91
|
-
register_step_definitions(step_definitions)
|
80
|
+
programming_language.load_code_file(step_def_file)
|
92
81
|
else
|
93
82
|
log.debug(" * #{step_def_file} [NOT SUPPORTED]\n")
|
94
83
|
end
|
95
84
|
end
|
96
85
|
|
97
|
-
def register_step_definitions(step_definitions)
|
98
|
-
step_definitions.each{|step_definition| register_step_definition(step_definition)}
|
99
|
-
end
|
100
|
-
|
101
86
|
# Loads and registers programming language implementation.
|
102
87
|
# Instances are cached, so calling with the same argument
|
103
88
|
# twice will return the same instance.
|
@@ -152,7 +137,9 @@ module Cucumber
|
|
152
137
|
end
|
153
138
|
|
154
139
|
def step_match(step_name, formatted_step_name=nil) #:nodoc:
|
155
|
-
matches =
|
140
|
+
matches = @programming_languages.map do |programming_language|
|
141
|
+
programming_language.step_matches(step_name, formatted_step_name)
|
142
|
+
end.flatten
|
156
143
|
raise Undefined.new(step_name) if matches.empty?
|
157
144
|
matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
|
158
145
|
raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
|
@@ -174,16 +161,11 @@ module Cucumber
|
|
174
161
|
top_groups
|
175
162
|
end
|
176
163
|
end
|
177
|
-
|
178
|
-
def clear! #:nodoc:
|
179
|
-
step_definitions.clear
|
180
|
-
hooks.clear
|
181
|
-
steps.clear
|
182
|
-
scenarios.clear
|
183
|
-
end
|
184
164
|
|
185
|
-
def
|
186
|
-
@
|
165
|
+
def unmatched_step_definitions
|
166
|
+
@programming_languages.map do |programming_language|
|
167
|
+
programming_language.unmatched_step_definitions
|
168
|
+
end.flatten
|
187
169
|
end
|
188
170
|
|
189
171
|
def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
|
@@ -244,17 +226,6 @@ module Cucumber
|
|
244
226
|
|
245
227
|
private
|
246
228
|
|
247
|
-
# Registers a StepDefinition. This can be a Ruby StepDefintion,
|
248
|
-
# or any other kind of object that implements the StepDefintion
|
249
|
-
# contract (API).
|
250
|
-
def register_step_definition(step_definition)
|
251
|
-
step_definitions.each do |already|
|
252
|
-
raise Redundant.new(already, step_definition) if already == step_definition
|
253
|
-
end
|
254
|
-
step_definitions << step_definition
|
255
|
-
step_definition
|
256
|
-
end
|
257
|
-
|
258
229
|
def programming_language_for(step_def_file) #:nodoc:
|
259
230
|
if ext = File.extname(step_def_file)[1..-1]
|
260
231
|
return nil if @unsupported_programming_languages.index(ext)
|
data/lib/cucumber/version.rb
CHANGED
@@ -20,17 +20,11 @@ module Cucumber
|
|
20
20
|
$y = $x * n.to_i
|
21
21
|
end
|
22
22
|
|
23
|
-
register
|
24
|
-
|
25
23
|
@visitor = TreeWalker.new(@step_mother)
|
26
24
|
|
27
25
|
@feature = mock('feature', :visit? => true).as_null_object
|
28
26
|
end
|
29
27
|
|
30
|
-
def register
|
31
|
-
@step_mother.register_step_definitions(@rb.step_definitions)
|
32
|
-
end
|
33
|
-
|
34
28
|
it "should execute Before blocks before background steps" do
|
35
29
|
background = Background.new(
|
36
30
|
comment=Comment.new(''),
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
module Cucumber::Ast
|
4
|
+
describe TreeWalker do
|
5
|
+
it "should visit features" do
|
6
|
+
tw = TreeWalker.new(nil, [mock('listener', :before_visit_features => nil)], {})
|
7
|
+
tw.should_not_receive(:warn)
|
8
|
+
tw.visit_features(mock('features', :accept => nil))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -193,6 +193,18 @@ module Cli
|
|
193
193
|
options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
|
194
194
|
end
|
195
195
|
|
196
|
+
it "does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line" do
|
197
|
+
given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html --format pretty]})
|
198
|
+
options.parse!(%w{--format progress --profile html})
|
199
|
+
options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
|
200
|
+
end
|
201
|
+
|
202
|
+
it "includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line" do
|
203
|
+
given_cucumber_yml_defined_as({'html' => %w[--format html]})
|
204
|
+
options.parse!(%w{--format rerun -o rerun.txt --profile html})
|
205
|
+
options[:formats].should == [['html', output_stream], ['rerun', 'rerun.txt']]
|
206
|
+
end
|
207
|
+
|
196
208
|
it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
|
197
209
|
given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
|
198
210
|
options.parse!(%w{--profile html})
|
@@ -18,10 +18,6 @@ module Cucumber
|
|
18
18
|
$inside = nil
|
19
19
|
end
|
20
20
|
|
21
|
-
def register
|
22
|
-
@step_mother.register_step_definitions(@rb.step_definitions)
|
23
|
-
end
|
24
|
-
|
25
21
|
it "should allow calling of other steps" do
|
26
22
|
@dsl.Given /Outside/ do
|
27
23
|
Given "Inside"
|
@@ -29,7 +25,6 @@ module Cucumber
|
|
29
25
|
@dsl.Given /Inside/ do
|
30
26
|
$inside = true
|
31
27
|
end
|
32
|
-
register
|
33
28
|
|
34
29
|
@step_mother.step_match("Outside").invoke(nil)
|
35
30
|
$inside.should == true
|
@@ -42,7 +37,6 @@ module Cucumber
|
|
42
37
|
@dsl.Given /Inside/ do |table|
|
43
38
|
$inside = table.raw[0][0]
|
44
39
|
end
|
45
|
-
register
|
46
40
|
|
47
41
|
@step_mother.step_match("Outside").invoke(nil)
|
48
42
|
$inside.should == 'inside'
|
@@ -52,7 +46,6 @@ module Cucumber
|
|
52
46
|
@dsl.Given /Outside/ do
|
53
47
|
Given 'Inside'
|
54
48
|
end
|
55
|
-
register
|
56
49
|
|
57
50
|
lambda do
|
58
51
|
@step_mother.step_match('Outside').invoke(nil)
|
@@ -63,7 +56,6 @@ module Cucumber
|
|
63
56
|
@dsl.Given /Outside/ do
|
64
57
|
pending("Do me!")
|
65
58
|
end
|
66
|
-
register
|
67
59
|
|
68
60
|
lambda do
|
69
61
|
@step_mother.step_match("Outside").invoke(nil)
|
@@ -77,7 +69,6 @@ module Cucumber
|
|
77
69
|
@dsl.Given /Loud/ do
|
78
70
|
announce 'wasup'
|
79
71
|
end
|
80
|
-
register
|
81
72
|
|
82
73
|
@step_mother.step_match("Loud").invoke(nil)
|
83
74
|
end
|
@@ -16,16 +16,11 @@ module Cucumber
|
|
16
16
|
@visitor = mock('Visitor')
|
17
17
|
end
|
18
18
|
|
19
|
-
def register
|
20
|
-
@step_mother.register_step_definitions(@rb.step_definitions)
|
21
|
-
end
|
22
|
-
|
23
19
|
it "should format step names" do
|
24
20
|
@dsl.Given(/it (.*) in (.*)/) do |what, month|
|
25
21
|
end
|
26
22
|
@dsl.Given(/nope something else/) do |what, month|
|
27
23
|
end
|
28
|
-
register
|
29
24
|
|
30
25
|
format = @step_mother.step_match("it snows in april").format_args("[%s]")
|
31
26
|
format.should == "it [snows] in [april]"
|
@@ -34,14 +29,13 @@ module Cucumber
|
|
34
29
|
it "should raise Ambiguous error with guess hint when multiple step definitions match" do
|
35
30
|
@dsl.Given(/Three (.*) mice/) {|disability|}
|
36
31
|
@dsl.Given(/Three blind (.*)/) {|animal|}
|
37
|
-
register
|
38
32
|
|
39
33
|
lambda do
|
40
34
|
@step_mother.step_match("Three blind mice")
|
41
35
|
end.should raise_error(Ambiguous, %{Ambiguous match of "Three blind mice":
|
42
36
|
|
43
|
-
spec/cucumber/step_mother_spec.rb:
|
44
|
-
spec/cucumber/step_mother_spec.rb:
|
37
|
+
spec/cucumber/step_mother_spec.rb:30:in `/Three (.*) mice/'
|
38
|
+
spec/cucumber/step_mother_spec.rb:31:in `/Three blind (.*)/'
|
45
39
|
|
46
40
|
You can run again with --guess to make Cucumber be more smart about it
|
47
41
|
})
|
@@ -52,14 +46,13 @@ You can run again with --guess to make Cucumber be more smart about it
|
|
52
46
|
|
53
47
|
@dsl.Given(/Three (.*) mice/) {|disability|}
|
54
48
|
@dsl.Given(/Three cute (.*)/) {|animal|}
|
55
|
-
|
56
|
-
|
49
|
+
|
57
50
|
lambda do
|
58
51
|
@step_mother.step_match("Three cute mice")
|
59
52
|
end.should raise_error(Ambiguous, %{Ambiguous match of "Three cute mice":
|
60
53
|
|
61
|
-
spec/cucumber/step_mother_spec.rb:
|
62
|
-
spec/cucumber/step_mother_spec.rb:
|
54
|
+
spec/cucumber/step_mother_spec.rb:47:in `/Three (.*) mice/'
|
55
|
+
spec/cucumber/step_mother_spec.rb:48:in `/Three cute (.*)/'
|
63
56
|
|
64
57
|
})
|
65
58
|
end
|
@@ -68,8 +61,7 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
68
61
|
@step_mother.options = {:guess => true}
|
69
62
|
@dsl.Given(/Three (.*) mice/) {|disability|}
|
70
63
|
@dsl.Given(/Three (.*)/) {|animal|}
|
71
|
-
|
72
|
-
|
64
|
+
|
73
65
|
lambda do
|
74
66
|
@step_mother.step_match("Three blind mice")
|
75
67
|
end.should_not raise_error
|
@@ -79,8 +71,7 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
79
71
|
@step_mother.options = {:guess => true}
|
80
72
|
right = @dsl.Given(/Three (.*) mice/) {|disability|}
|
81
73
|
wrong = @dsl.Given(/Three (.*)/) {|animal|}
|
82
|
-
|
83
|
-
|
74
|
+
|
84
75
|
@step_mother.step_match("Three blind mice").step_definition.should == right
|
85
76
|
end
|
86
77
|
|
@@ -88,8 +79,7 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
88
79
|
@step_mother.options = {:guess => true}
|
89
80
|
right = @dsl.Given(/Three (.*) mice ran (.*)/) {|disability|}
|
90
81
|
wrong = @dsl.Given(/Three (.*)/) {|animal|}
|
91
|
-
|
92
|
-
|
82
|
+
|
93
83
|
@step_mother.step_match("Three blind mice ran far").step_definition.should == right
|
94
84
|
end
|
95
85
|
|
@@ -98,8 +88,7 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
98
88
|
general = @dsl.Given(/Three (.*) mice ran (.*)/) {|disability|}
|
99
89
|
specific = @dsl.Given(/Three blind mice ran far/) {}
|
100
90
|
more_specific = @dsl.Given(/^Three blind mice ran far$/) {}
|
101
|
-
|
102
|
-
|
91
|
+
|
103
92
|
@step_mother.step_match("Three blind mice ran far").step_definition.should == more_specific
|
104
93
|
end
|
105
94
|
|
@@ -109,19 +98,10 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
109
98
|
end.should raise_error(Undefined)
|
110
99
|
end
|
111
100
|
|
112
|
-
it "should raise Redundant error when same regexp is registered twice" do
|
113
|
-
@dsl.Given(/Three (.*) mice/) {|disability|}
|
114
|
-
lambda do
|
115
|
-
@dsl.Given(/Three (.*) mice/) {|disability|}
|
116
|
-
register
|
117
|
-
end.should raise_error(Redundant)
|
118
|
-
end
|
119
|
-
|
120
101
|
# http://railsforum.com/viewtopic.php?pid=93881
|
121
102
|
it "should not raise Redundant unless it's really redundant" do
|
122
103
|
@dsl.Given(/^(.*) (.*) user named '(.*)'$/) {|a,b,c|}
|
123
104
|
@dsl.Given(/^there is no (.*) user named '(.*)'$/) {|a,b|}
|
124
|
-
register
|
125
105
|
end
|
126
106
|
|
127
107
|
it "should raise an error if the world is nil" do
|
@@ -133,7 +113,7 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
133
113
|
raise "Should fail"
|
134
114
|
rescue RbSupport::NilWorld => e
|
135
115
|
e.message.should == "World procs should never return nil"
|
136
|
-
e.backtrace.should == ["spec/cucumber/step_mother_spec.rb:
|
116
|
+
e.backtrace.should == ["spec/cucumber/step_mother_spec.rb:108:in `World'"]
|
137
117
|
end
|
138
118
|
end
|
139
119
|
|
@@ -163,8 +143,8 @@ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
|
|
163
143
|
end.should raise_error(RbSupport::MultipleWorld, %{You can only pass a proc to #World once, but it's happening
|
164
144
|
in 2 places:
|
165
145
|
|
166
|
-
spec/cucumber/step_mother_spec.rb:
|
167
|
-
spec/cucumber/step_mother_spec.rb:
|
146
|
+
spec/cucumber/step_mother_spec.rb:140:in `World'
|
147
|
+
spec/cucumber/step_mother_spec.rb:142:in `World'
|
168
148
|
|
169
149
|
Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc
|
170
150
|
or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.
|
@@ -175,8 +155,7 @@ or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.
|
|
175
155
|
it "should find before hooks" do
|
176
156
|
fish = @dsl.Before('@fish'){}
|
177
157
|
meat = @dsl.Before('@meat'){}
|
178
|
-
|
179
|
-
|
158
|
+
|
180
159
|
scenario = mock('Scenario')
|
181
160
|
scenario.should_receive(:accept_hook?).with(fish).and_return(true)
|
182
161
|
scenario.should_receive(:accept_hook?).with(meat).and_return(false)
|