kosmas58-cucumber 0.2.2.1 → 0.2.3.3
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 +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
|