kosmas58-cucumber 0.2.2.1 → 0.2.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +57 -5
- data/Manifest.txt +21 -4
- data/bin/cucumber +1 -1
- data/config/hoe.rb +2 -2
- data/examples/i18n/Rakefile +6 -8
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/ar/lib/calculator.rb +1 -0
- data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/en/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/es/features/step_definitons/calculador_steps.rb +1 -1
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
- data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
- data/examples/i18n/id/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
- data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/ko/features/addition.feature +1 -1
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/no/features/support/env.rb +1 -1
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
- data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/ru/features/support/env.rb +1 -1
- data/examples/i18n/ru/features/support/world.rb +4 -3
- data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
- data/examples/i18n/sk/Rakefile +6 -0
- data/examples/i18n/sk/features/addition.feature +16 -0
- data/examples/i18n/sk/features/division.feature +9 -0
- data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/sk/lib/calculator.rb +14 -0
- data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/self_test/features/background/background_with_name.feature +7 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +8 -2
- data/examples/self_test/features/undefined_multiline_args.feature +12 -0
- data/examples/sinatra/features/support/env.rb +2 -6
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
- data/examples/tickets/Rakefile +1 -1
- data/examples/tickets/features/246.feature +4 -0
- data/examples/tickets/features/270/back.feature +14 -0
- data/examples/tickets/features/270/back.steps.rb +14 -0
- data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
- data/features/background.feature +21 -4
- data/features/cucumber_cli.feature +18 -5
- data/features/cucumber_cli_outlines.feature +5 -2
- data/features/snippet.feature +23 -0
- data/features/step_definitions/cucumber_steps.rb +6 -2
- data/features/usage.feature +5 -0
- data/gem_tasks/rspec.rake +3 -2
- data/lib/cucumber/ast/background.rb +3 -3
- data/lib/cucumber/ast/examples.rb +0 -12
- data/lib/cucumber/ast/feature.rb +2 -12
- data/lib/cucumber/ast/feature_element.rb +0 -8
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +14 -22
- data/lib/cucumber/ast/py_string.rb +6 -11
- data/lib/cucumber/ast/scenario.rb +1 -8
- data/lib/cucumber/ast/scenario_outline.rb +1 -11
- data/lib/cucumber/ast/step.rb +3 -9
- data/lib/cucumber/ast/step_collection.rb +0 -4
- data/lib/cucumber/ast/step_invocation.rb +5 -6
- data/lib/cucumber/ast/table.rb +26 -22
- data/lib/cucumber/ast/tags.rb +0 -8
- data/lib/cucumber/ast/visitor.rb +12 -25
- data/lib/cucumber/cli/configuration.rb +2 -2
- data/lib/cucumber/cli/main.rb +5 -2
- data/lib/cucumber/core_ext/instance_exec.rb +17 -4
- data/lib/cucumber/formatter/ansicolor.rb +10 -2
- data/lib/cucumber/formatter/console.rb +2 -1
- data/lib/cucumber/formatter/html.rb +21 -7
- data/lib/cucumber/formatter/pretty.rb +27 -20
- data/lib/cucumber/formatter/usage.rb +16 -0
- data/lib/cucumber/languages.yml +68 -7
- data/lib/cucumber/parser/feature.rb +238 -135
- data/lib/cucumber/parser/feature.tt +117 -22
- data/lib/cucumber/parser/i18n.tt +4 -0
- data/lib/cucumber/parser/table.rb +37 -25
- data/lib/cucumber/parser/table.tt +15 -3
- data/lib/cucumber/parser/treetop_ext.rb +48 -9
- data/lib/cucumber/parser.rb +2 -7
- data/lib/cucumber/step_definition.rb +13 -14
- data/lib/cucumber/step_mother.rb +93 -11
- data/lib/cucumber/version.rb +2 -2
- data/rails_generators/cucumber/templates/env.rb +1 -1
- data/rails_generators/cucumber/templates/paths.rb +15 -5
- data/rails_generators/cucumber/templates/webrat_steps.rb +8 -0
- data/spec/cucumber/ast/background_spec.rb +1 -0
- data/spec/cucumber/ast/feature_factory.rb +1 -1
- data/spec/cucumber/ast/feature_spec.rb +2 -2
- data/spec/cucumber/ast/scenario_spec.rb +0 -27
- data/spec/cucumber/ast/table_spec.rb +23 -2
- data/spec/cucumber/core_ext/proc_spec.rb +25 -8
- data/spec/cucumber/parser/feature_parser_spec.rb +43 -41
- data/spec/cucumber/step_definition_spec.rb +8 -0
- data/spec/cucumber/step_mother_spec.rb +48 -0
- data/spec/spec_helper.rb +2 -11
- metadata +17 -6
- data/examples/tickets/cucumber.yml +0 -3
- data/lib/cucumber/parser/basic.rb +0 -0
- data/spec/cucumber/ast/tags_spec.rb +0 -19
data/lib/cucumber/step_mother.rb
CHANGED
@@ -45,6 +45,23 @@ module Cucumber
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
class NilWorld < StandardError
|
49
|
+
def initialize
|
50
|
+
super("World procs should never return nil")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class MultipleWorld < StandardError
|
55
|
+
def initialize(first_proc, second_proc)
|
56
|
+
message = "You can only pass a proc to #World once, but it's happening\n"
|
57
|
+
message << "in 2 places:\n\n"
|
58
|
+
message << first_proc.backtrace_line('World') << "\n"
|
59
|
+
message << second_proc.backtrace_line('World') << "\n\n"
|
60
|
+
message << "Use Ruby modules instead to extend your worlds. See the #World RDoc.\n\n"
|
61
|
+
super(message)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
48
65
|
# This is the main interface for registering step definitions, which is done
|
49
66
|
# from <tt>*_steps.rb</tt> files. This module is included right at the top-level
|
50
67
|
# so #register_step_definition (and more interestingly - its aliases) are
|
@@ -105,10 +122,46 @@ module Cucumber
|
|
105
122
|
(@after_procs ||= []).unshift(proc)
|
106
123
|
end
|
107
124
|
|
108
|
-
# Registers
|
109
|
-
#
|
110
|
-
|
111
|
-
|
125
|
+
# Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
|
126
|
+
# The +proc+ will be executed once before each scenario to create an
|
127
|
+
# Object that the scenario's steps will run within. Any +world_modules+
|
128
|
+
# will be mixed into this Object (via Object#extend).
|
129
|
+
#
|
130
|
+
# This method is typically called from one or more Ruby scripts under
|
131
|
+
# <tt>features/support</tt>. You can call this method as many times as you
|
132
|
+
# like (to register more modules), but if you try to register more than
|
133
|
+
# one Proc you will get an error.
|
134
|
+
#
|
135
|
+
# Cucumber will not yield anything to the +proc+ (like it used to do before v0.3).
|
136
|
+
#
|
137
|
+
# In earlier versions of Cucumber (before 0.3) you could not register
|
138
|
+
# any +world_modules+. Instead you would register several Proc objects (by
|
139
|
+
# calling the method several times). The result of each +proc+ would be yielded
|
140
|
+
# to the next +proc+. Example:
|
141
|
+
#
|
142
|
+
# World do |world| # NOT SUPPORTED FROM 0.3
|
143
|
+
# MyClass.new
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
# World do |world| # NOT SUPPORTED FROM 0.3
|
147
|
+
# world.extend(MyModule)
|
148
|
+
# end
|
149
|
+
#
|
150
|
+
# From Cucumber 0.3 the recommended way to do this is:
|
151
|
+
#
|
152
|
+
# World do
|
153
|
+
# MyClass.new
|
154
|
+
# end
|
155
|
+
#
|
156
|
+
# World(MyModule)
|
157
|
+
#
|
158
|
+
def World(*world_modules, &proc)
|
159
|
+
if(proc)
|
160
|
+
raise MultipleWorld.new(@world_proc, proc) if @world_proc
|
161
|
+
@world_proc = proc
|
162
|
+
end
|
163
|
+
@world_modules ||= []
|
164
|
+
@world_modules += world_modules
|
112
165
|
end
|
113
166
|
|
114
167
|
def current_world
|
@@ -139,8 +192,8 @@ module Cucumber
|
|
139
192
|
@step_definitions ||= []
|
140
193
|
end
|
141
194
|
|
142
|
-
def snippet_text(step_keyword, step_name)
|
143
|
-
@snippet_generator.snippet_text(step_keyword, step_name)
|
195
|
+
def snippet_text(step_keyword, step_name, multiline_arg_class)
|
196
|
+
@snippet_generator.snippet_text(step_keyword, step_name, multiline_arg_class)
|
144
197
|
end
|
145
198
|
|
146
199
|
def before_and_after(scenario, skip=false)
|
@@ -168,17 +221,46 @@ module Cucumber
|
|
168
221
|
|
169
222
|
# Creates a new world instance
|
170
223
|
def new_world!
|
171
|
-
|
172
|
-
|
173
|
-
|
224
|
+
create_world!
|
225
|
+
extend_world
|
226
|
+
connect_world
|
227
|
+
@current_world
|
228
|
+
end
|
229
|
+
|
230
|
+
def create_world!
|
231
|
+
if(@world_proc)
|
232
|
+
@current_world = @world_proc.call
|
233
|
+
check_nil(@current_world, @world_proc)
|
234
|
+
else
|
235
|
+
@current_world = Object.new
|
174
236
|
end
|
237
|
+
end
|
175
238
|
|
239
|
+
def extend_world
|
176
240
|
@current_world.extend(World)
|
241
|
+
@current_world.extend(::Spec::Matchers) if defined?(::Spec::Matchers)
|
242
|
+
(@world_modules || []).each do |mod|
|
243
|
+
@current_world.extend(mod)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def connect_world
|
177
248
|
@current_world.__cucumber_step_mother = self
|
178
249
|
@current_world.__cucumber_visitor = @visitor
|
250
|
+
end
|
179
251
|
|
180
|
-
|
181
|
-
|
252
|
+
def check_nil(o, proc)
|
253
|
+
if o.nil?
|
254
|
+
begin
|
255
|
+
raise NilWorld.new
|
256
|
+
rescue NilWorld => e
|
257
|
+
e.backtrace.clear
|
258
|
+
e.backtrace.push(proc.backtrace_line("World"))
|
259
|
+
raise e
|
260
|
+
end
|
261
|
+
else
|
262
|
+
o
|
263
|
+
end
|
182
264
|
end
|
183
265
|
|
184
266
|
def nil_world!
|
data/lib/cucumber/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
ENV["RAILS_ENV"] ||= "test"
|
3
3
|
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
|
4
4
|
require 'cucumber/rails/world'
|
5
|
-
require 'cucumber/
|
5
|
+
require 'cucumber/formatter/unicode' # Comment out this line if you don't want Cucumber Unicode support
|
6
6
|
Cucumber::Rails.use_transactional_fixtures
|
7
7
|
Cucumber::Rails.bypass_rescue # Comment out this line if you want Rails own error handling
|
8
8
|
# (e.g. rescue_action_in_public / rescue_responses / rescue_from)
|
@@ -1,4 +1,16 @@
|
|
1
1
|
module NavigationHelpers
|
2
|
+
# Maps a static name to a static route.
|
3
|
+
#
|
4
|
+
# This method is *not* designed to map from a dynamic name to a
|
5
|
+
# dynamic route like <tt>post_comments_path(post)</tt>. For dynamic
|
6
|
+
# routes like this you should *not* rely on #path_to, but write
|
7
|
+
# your own step definitions instead. Example:
|
8
|
+
#
|
9
|
+
# Given /I am on the comments page for the "(.+)" post/ |name|
|
10
|
+
# post = Post.find_by_name(name)
|
11
|
+
# visit post_comments_path(post)
|
12
|
+
# end
|
13
|
+
#
|
2
14
|
def path_to(page_name)
|
3
15
|
case page_name
|
4
16
|
|
@@ -8,12 +20,10 @@ module NavigationHelpers
|
|
8
20
|
# Add more page name => path mappings here
|
9
21
|
|
10
22
|
else
|
11
|
-
raise "Can't find mapping from \"#{page_name}\" to a path
|
23
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
24
|
+
"Now, go and add a mapping in features/support/paths.rb"
|
12
25
|
end
|
13
26
|
end
|
14
27
|
end
|
15
28
|
|
16
|
-
World
|
17
|
-
world.extend NavigationHelpers
|
18
|
-
world
|
19
|
-
end
|
29
|
+
World(NavigationHelpers)
|
@@ -113,3 +113,11 @@ Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
|
|
113
113
|
assert field_labeled(label).checked?
|
114
114
|
<% end -%>
|
115
115
|
end
|
116
|
+
|
117
|
+
Then /^I should be on (.+)$/ do |page_name|
|
118
|
+
<% if framework == :rspec -%>
|
119
|
+
URI.parse(current_url).path.should == path_to(page_name)
|
120
|
+
<% else -%>
|
121
|
+
assert_equal path_to(page_name), URI.parse(current_url).path
|
122
|
+
<% end -%>
|
123
|
+
end
|
@@ -25,9 +25,9 @@ module Cucumber
|
|
25
25
|
[:step_invocation, 3, "Given", "a passing step"], # From the background
|
26
26
|
[:step_invocation, 10, "Given", "a passing step with an inline arg:",
|
27
27
|
[:table,
|
28
|
-
[:row,
|
28
|
+
[:row, -1,
|
29
29
|
[:cell, "1"], [:cell, "22"], [:cell, "333"]],
|
30
|
-
[:row,
|
30
|
+
[:row, -1,
|
31
31
|
[:cell, "4444"], [:cell, "55555"], [:cell, "666666"]]]],
|
32
32
|
[:step_invocation, 11, "Given", "a happy step with an inline arg:",
|
33
33
|
[:py_string, "\n I like\nCucumber sandwich\n"]],
|
@@ -33,33 +33,6 @@ module Cucumber
|
|
33
33
|
$y.should == nil
|
34
34
|
end
|
35
35
|
|
36
|
-
it "should be at exact line" do
|
37
|
-
s = Scenario.new(background=nil, comment=Comment.new(""),
|
38
|
-
tags=Tags.new(44, []), 45, keyword="", name="", steps=[])
|
39
|
-
|
40
|
-
s.should be_matches_lines([44])
|
41
|
-
s.should be_matches_lines([45])
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should be at line if tags or steps are" do
|
45
|
-
s = Scenario.new(
|
46
|
-
background=nil,
|
47
|
-
comment=Comment.new(""),
|
48
|
-
tags=Tags.new(43, []),
|
49
|
-
line=45,
|
50
|
-
keyword="",
|
51
|
-
name="",
|
52
|
-
steps=[
|
53
|
-
Step.new(46, "Given", ""),
|
54
|
-
Step.new(47, "Given", ""),
|
55
|
-
Step.new(48, "Given", ""),
|
56
|
-
]
|
57
|
-
)
|
58
|
-
|
59
|
-
s.should be_matches_lines([43])
|
60
|
-
s.should be_matches_lines([47])
|
61
|
-
s.should_not be_matches_lines([49])
|
62
|
-
end
|
63
36
|
end
|
64
37
|
end
|
65
38
|
end
|
@@ -69,6 +69,27 @@ module Cucumber
|
|
69
69
|
@table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
|
70
70
|
end
|
71
71
|
end
|
72
|
+
|
73
|
+
describe ".rows_hash" do
|
74
|
+
|
75
|
+
it "should return a hash of the rows" do
|
76
|
+
table = Table.new([
|
77
|
+
%w{one 1111},
|
78
|
+
%w{two 22222}
|
79
|
+
])
|
80
|
+
table.rows_hash.should == {'one' => '1111', 'two' => '22222'}
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should fail if the table doesn't have two columns" do
|
84
|
+
faulty_table = Table.new([
|
85
|
+
%w{one 1111 abc},
|
86
|
+
%w{two 22222 def}
|
87
|
+
])
|
88
|
+
lambda {
|
89
|
+
faulty_table.rows_hash
|
90
|
+
}.should raise_error('The table must have exactly 2 columns')
|
91
|
+
end
|
92
|
+
end
|
72
93
|
|
73
94
|
it "should allow renaming columns" do
|
74
95
|
table2 = @table.map_headers('one' => :three)
|
@@ -134,12 +155,12 @@ module Cucumber
|
|
134
155
|
it "should convert to sexp" do
|
135
156
|
@table.to_sexp.should ==
|
136
157
|
[:table,
|
137
|
-
[:row,
|
158
|
+
[:row, -1,
|
138
159
|
[:cell, "one"],
|
139
160
|
[:cell, "four"],
|
140
161
|
[:cell, "seven"]
|
141
162
|
],
|
142
|
-
[:row,
|
163
|
+
[:row, -1,
|
143
164
|
[:cell, "4444"],
|
144
165
|
[:cell, "55555"],
|
145
166
|
[:cell, "666666"]]]
|
@@ -2,36 +2,53 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
require 'cucumber/core_ext/instance_exec'
|
3
3
|
|
4
4
|
describe Proc do
|
5
|
+
it "should remove extraneous path info for file" do
|
6
|
+
proc = lambda {|a,b|}
|
7
|
+
proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:6/
|
8
|
+
end
|
9
|
+
|
5
10
|
it "should raise ArityMismatchError for too many args (expecting 0)" do
|
6
11
|
lambda {
|
7
12
|
Object.new.cucumber_instance_exec(true, 'foo', 1) do
|
8
13
|
end
|
9
|
-
}.should raise_error(Cucumber::ArityMismatchError, "
|
14
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
|
10
15
|
end
|
11
16
|
|
12
17
|
it "should raise ArityMismatchError for too many args (expecting 1)" do
|
13
18
|
lambda {
|
14
19
|
Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
|
15
20
|
end
|
16
|
-
}.should raise_error(Cucumber::ArityMismatchError, "
|
21
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
|
17
22
|
end
|
18
23
|
|
19
24
|
it "should raise ArityMismatchError for too few args (expecting 1)" do
|
20
25
|
lambda {
|
21
26
|
Object.new.cucumber_instance_exec(true, 'foo') do |a|
|
22
27
|
end
|
23
|
-
}.should raise_error(Cucumber::ArityMismatchError, "
|
28
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
|
24
29
|
end
|
25
30
|
|
26
31
|
it "should raise ArityMismatchError for too few args (expecting 2)" do
|
27
32
|
lambda {
|
28
33
|
Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
|
29
34
|
end
|
30
|
-
}.should raise_error(Cucumber::ArityMismatchError, "
|
35
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
|
31
36
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
|
38
|
+
if Cucumber::RUBY_1_9
|
39
|
+
it "should allow varargs" do
|
40
|
+
lambda {
|
41
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
|
42
|
+
end
|
43
|
+
}.should_not raise_error(Cucumber::ArityMismatchError)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
# Ruby 1.8
|
47
|
+
it "should not allow varargs because Ruby 1.8 reports same arity as with no args, so we can't really tell the difference." do
|
48
|
+
lambda {
|
49
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
|
50
|
+
end
|
51
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
|
52
|
+
end
|
36
53
|
end
|
37
54
|
end
|
@@ -13,19 +13,11 @@ module Cucumber
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def parse_file(file)
|
16
|
-
@parser.parse_file(File.dirname(__FILE__) + "/../treetop_parser/" + file)
|
16
|
+
@parser.parse_file(File.dirname(__FILE__) + "/../treetop_parser/" + file, {})
|
17
17
|
end
|
18
18
|
|
19
19
|
def parse_example_file(file)
|
20
|
-
@parser.parse_file(File.dirname(__FILE__) + "/../../../examples/" + file)
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "Header" do
|
24
|
-
it "should parse Feature with blurb" do
|
25
|
-
parse(%{Feature: hi
|
26
|
-
with blurb
|
27
|
-
})
|
28
|
-
end
|
20
|
+
@parser.parse_file(File.dirname(__FILE__) + "/../../../examples/" + file, {})
|
29
21
|
end
|
30
22
|
|
31
23
|
describe "Comments" do
|
@@ -36,23 +28,6 @@ Feature: hi
|
|
36
28
|
[:feature, nil, "Feature: hi\n",
|
37
29
|
[:comment, "# My comment\n"]]
|
38
30
|
end
|
39
|
-
|
40
|
-
it "should parse a comment within a scenario" do
|
41
|
-
pending "Store comment in node and output it in pretty formatter"
|
42
|
-
parse(%{Feature: Hi
|
43
|
-
Scenario: Hello
|
44
|
-
Given foo
|
45
|
-
# When bar
|
46
|
-
Then baz
|
47
|
-
}).to_sexp.should ==
|
48
|
-
[:feature, nil, "Feature: Hi",
|
49
|
-
[:scenario, 2, "Scenario:", "Hello",
|
50
|
-
[:step, 3, "Given", "foo"],
|
51
|
-
[:comment, "# When bar\n"],
|
52
|
-
[:step, 5, "Then", "baz"]
|
53
|
-
]
|
54
|
-
]
|
55
|
-
end
|
56
31
|
|
57
32
|
it "should parse a file with only a multiline comment" do
|
58
33
|
parse(%{# Hello
|
@@ -149,7 +124,7 @@ Given I have a table
|
|
149
124
|
[:scenario, 2, "Scenario:", "Hello",
|
150
125
|
[:step_invocation, 3, "Given", "I have a table",
|
151
126
|
[:table,
|
152
|
-
[:row,
|
127
|
+
[:row, 4,
|
153
128
|
[:cell, "a"],
|
154
129
|
[:cell, "b"]]]]]]
|
155
130
|
end
|
@@ -187,9 +162,10 @@ Examples:
|
|
187
162
|
[:step, 3, "Given", "a <what> cucumber"],
|
188
163
|
[:examples, "Examples:", "",
|
189
164
|
[:table,
|
190
|
-
[:row,
|
165
|
+
[:row, 5,
|
191
166
|
[:cell, "what"]],
|
192
|
-
|
167
|
+
[:row, 6,
|
168
|
+
[:cell, "green"]]]]]]
|
193
169
|
end
|
194
170
|
|
195
171
|
it "should have line numbered steps with inline table" do
|
@@ -207,15 +183,15 @@ Examples:
|
|
207
183
|
[:scenario_outline, "Scenario Outline:", "Hello",
|
208
184
|
[:step, 4, "Given", "I have a table",
|
209
185
|
[:table,
|
210
|
-
[:row,
|
186
|
+
[:row, 6,
|
211
187
|
[:cell, "<a>"],
|
212
188
|
[:cell, "<b>"]]]],
|
213
189
|
[:examples, "Examples:", "",
|
214
190
|
[:table,
|
215
|
-
[:row,
|
191
|
+
[:row, 8,
|
216
192
|
[:cell, "a"],
|
217
193
|
[:cell, "b"]],
|
218
|
-
[:row,
|
194
|
+
[:row, 9,
|
219
195
|
[:cell, "c"],
|
220
196
|
[:cell, "d"]]]]]]
|
221
197
|
end
|
@@ -237,23 +213,18 @@ Examples:
|
|
237
213
|
[:scenario_outline, "Scenario Outline:", "Hello",
|
238
214
|
[:step, 5, "Given", "I have a table",
|
239
215
|
[:table,
|
240
|
-
[:row,
|
216
|
+
[:row, 6,
|
241
217
|
[:cell, "1"],
|
242
218
|
[:cell, "2"]]]],
|
243
219
|
[:examples, "Examples:", "",
|
244
220
|
[:table,
|
245
|
-
[:row,
|
221
|
+
[:row, 9,
|
246
222
|
[:cell, "x"],
|
247
223
|
[:cell, "y"]],
|
248
|
-
[:row,
|
224
|
+
[:row, 10,
|
249
225
|
[:cell, "5"],
|
250
226
|
[:cell, "6"]]]]]]
|
251
227
|
end
|
252
|
-
|
253
|
-
it "should set line numbers on feature" do
|
254
|
-
feature = parse_file("empty_feature.feature:11:12")
|
255
|
-
feature.instance_variable_get('@lines').should == [11, 12]
|
256
|
-
end
|
257
228
|
end
|
258
229
|
|
259
230
|
describe "Syntax" do
|
@@ -277,6 +248,37 @@ Examples:
|
|
277
248
|
parse_file("scenario_outline.feature")
|
278
249
|
end
|
279
250
|
end
|
251
|
+
|
252
|
+
describe "Filtering" do
|
253
|
+
it "should filter outline tables" do
|
254
|
+
f = parse_example_file('self_test/features/outline_sample.feature:12')
|
255
|
+
f.to_sexp.should ==
|
256
|
+
[:feature,
|
257
|
+
"./spec/cucumber/parser/../../../examples/self_test/features/outline_sample.feature",
|
258
|
+
"Feature: Outline Sample",
|
259
|
+
[:scenario_outline,
|
260
|
+
"Scenario Outline:",
|
261
|
+
"Test state",
|
262
|
+
[:step, 6, "Given", "<state> without a table"],
|
263
|
+
[:step, 7, "Given", "<other_state> without a table"],
|
264
|
+
[:examples,
|
265
|
+
"Examples:",
|
266
|
+
"Rainbow colours",
|
267
|
+
[:table,
|
268
|
+
[:row, 9, [:cell, "state"], [:cell, "other_state"]],
|
269
|
+
# [:row, 10, [:cell, "missing"], [:cell, "passing"]],
|
270
|
+
# [:row, 11, [:cell, "passing"], [:cell, "passing"]],
|
271
|
+
[:row, 12, [:cell, "failing"], [:cell, "passing"]]]]
|
272
|
+
# ,
|
273
|
+
# [:examples,
|
274
|
+
# "Examples:",
|
275
|
+
# "Only passing",
|
276
|
+
# [:table,
|
277
|
+
# [:row, 14, [:cell, "state"], [:cell, "other_state"]],
|
278
|
+
# [:row, 15, [:cell, "passing"], [:cell, "passing"]]]]]
|
279
|
+
]]
|
280
|
+
end
|
281
|
+
end
|
280
282
|
end
|
281
283
|
end
|
282
284
|
end
|
@@ -82,6 +82,14 @@ module Cucumber
|
|
82
82
|
})
|
83
83
|
end
|
84
84
|
|
85
|
+
it "should recognise several quoted words in name and make according regexp and args" do
|
86
|
+
StepDefinition.snippet_text('Given', 'A "first" and "second" arg').should == unindented(%{
|
87
|
+
Given /^A "([^\\"]*)" and "([^\\"]*)" arg$/ do |arg1, arg2|
|
88
|
+
pending
|
89
|
+
end
|
90
|
+
})
|
91
|
+
end
|
92
|
+
|
85
93
|
it "should not use quote group when there are no quotes" do
|
86
94
|
StepDefinition.snippet_text('Given', 'A first arg').should == unindented(%{
|
87
95
|
Given /^A first arg$/ do
|
@@ -85,5 +85,53 @@ spec/cucumber/step_mother_spec.rb:40:in `/Three cute (.*)/'
|
|
85
85
|
@step_mother.Given(/Three (.*) mice/) {|disability|}
|
86
86
|
end.should raise_error(Redundant)
|
87
87
|
end
|
88
|
+
|
89
|
+
it "should raise an error if the world is nil" do
|
90
|
+
@step_mother.World do
|
91
|
+
end
|
92
|
+
|
93
|
+
begin
|
94
|
+
@step_mother.before_and_after(nil)
|
95
|
+
raise "Should fail"
|
96
|
+
rescue NilWorld => e
|
97
|
+
e.message.should == "World procs should never return nil"
|
98
|
+
e.backtrace.should == ["spec/cucumber/step_mother_spec.rb:90:in `World'"]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module ModuleOne
|
103
|
+
end
|
104
|
+
|
105
|
+
module ModuleTwo
|
106
|
+
end
|
107
|
+
|
108
|
+
class ClassOne
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should implicitly extend world with modules" do
|
112
|
+
@step_mother.World(ModuleOne, ModuleTwo)
|
113
|
+
|
114
|
+
w = @step_mother.__send__(:new_world!)
|
115
|
+
class << w
|
116
|
+
included_modules.index(ModuleOne).should_not == nil
|
117
|
+
included_modules.index(ModuleTwo).should_not == nil
|
118
|
+
end
|
119
|
+
w.class.should == Object
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should raise error when we try to register more than one World proc" do
|
123
|
+
@step_mother.World { Hash.new }
|
124
|
+
lambda do
|
125
|
+
@step_mother.World { Array.new }
|
126
|
+
end.should raise_error(MultipleWorld, %{You can only pass a proc to #World once, but it's happening
|
127
|
+
in 2 places:
|
128
|
+
|
129
|
+
spec/cucumber/step_mother_spec.rb:123:in `World'
|
130
|
+
spec/cucumber/step_mother_spec.rb:125:in `World'
|
131
|
+
|
132
|
+
Use Ruby modules instead to extend your worlds. See the #World RDoc.
|
133
|
+
|
134
|
+
})
|
135
|
+
end
|
88
136
|
end
|
89
137
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,21 +1,12 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
gem 'rspec'
|
3
|
-
require 'spec
|
3
|
+
require 'spec'
|
4
|
+
require 'spec/autorun'
|
4
5
|
|
5
6
|
ENV['CUCUMBER_COLORS']=nil
|
6
|
-
$KCODE='u'
|
7
7
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
8
8
|
require 'cucumber'
|
9
9
|
Cucumber.load_language('en')
|
10
10
|
$:.unshift(File.dirname(__FILE__))
|
11
11
|
|
12
12
|
::Term::ANSIColor.coloring = true
|
13
|
-
|
14
|
-
# Open up the tree classes a little for easier inspection.
|
15
|
-
module Cucumber
|
16
|
-
module Tree
|
17
|
-
class Feature
|
18
|
-
attr_reader :header, :scenarios
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|