cucumber 0.2.3 → 0.3.0
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 +56 -1
- data/Manifest.txt +70 -49
- data/config/hoe.rb +1 -1
- data/cucumber.yml +1 -1
- data/examples/i18n/bg/Rakefile +6 -0
- data/examples/i18n/bg/features/addition.feature +11 -0
- data/examples/i18n/bg/features/consecutive_calculations.feature +18 -0
- data/examples/i18n/bg/features/division.feature +16 -0
- data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/bg/features/support/env.rb +6 -0
- data/examples/i18n/bg/features/support/world.rb +8 -0
- data/examples/i18n/bg/lib/calculator.rb +24 -0
- data/examples/i18n/ru/features/support/world.rb +4 -3
- 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/self_test/features/background/background_with_name.feature +7 -0
- data/examples/self_test/features/background/passing_background.feature +2 -2
- data/examples/self_test/features/step_definitions/sample_steps.rb +18 -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/229/tagged_hooks.feature +8 -0
- data/examples/tickets/features/229/tagged_hooks.rb +14 -0
- data/examples/tickets/features/270/back.feature +14 -0
- data/examples/tickets/features/270/back.steps.rb +14 -0
- data/examples/tickets/features/279/py_string_indent.feature +25 -0
- data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
- data/examples/tickets/features/279/wrong.feature_ +11 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +0 -7
- data/features/background.feature +21 -3
- data/features/cucumber_cli.feature +18 -5
- data/features/cucumber_cli_outlines.feature +4 -1
- data/features/rake_task.feature +132 -0
- data/features/snippet.feature +23 -0
- data/features/step_definitions/cucumber_steps.rb +46 -15
- data/features/support/env.rb +61 -4
- data/features/usage.feature +5 -0
- data/gem_tasks/deployment.rake +1 -1
- data/lib/cucumber/ast/background.rb +14 -4
- data/lib/cucumber/ast/examples.rb +0 -12
- data/lib/cucumber/ast/feature.rb +2 -12
- data/lib/cucumber/ast/feature_element.rb +4 -8
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +20 -20
- 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 +5 -22
- data/lib/cucumber/ast/tags.rb +9 -9
- data/lib/cucumber/ast/visitor.rb +12 -25
- data/lib/cucumber/cli/configuration.rb +4 -4
- data/lib/cucumber/cli/main.rb +10 -3
- data/lib/cucumber/core_ext/instance_exec.rb +17 -4
- data/lib/cucumber/formatter/ansicolor.rb +1 -1
- 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 +23 -5
- data/lib/cucumber/parser/feature.rb +231 -114
- data/lib/cucumber/parser/feature.tt +120 -25
- 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/rake/task.rb +29 -6
- data/lib/cucumber/step_definition.rb +4 -2
- data/lib/cucumber/step_mother.rb +143 -26
- data/lib/cucumber/version.rb +2 -2
- data/rails_generators/cucumber/templates/paths.rb +13 -4
- data/rails_generators/cucumber/templates/webrat_steps.rb +16 -0
- data/{specs → spec}/cucumber/ast/background_spec.rb +1 -0
- data/{specs → spec}/cucumber/ast/feature_factory.rb +1 -1
- data/{specs → spec}/cucumber/ast/feature_spec.rb +2 -2
- data/{specs → spec}/cucumber/ast/py_string_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/scenario_outline_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/scenario_spec.rb +0 -27
- data/{specs → spec}/cucumber/ast/step_collection_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/step_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/table_spec.rb +2 -2
- data/{specs → spec}/cucumber/broadcaster_spec.rb +0 -0
- data/{specs → spec}/cucumber/cli/configuration_spec.rb +0 -0
- data/{specs → spec}/cucumber/cli/main_spec.rb +5 -1
- data/spec/cucumber/core_ext/proc_spec.rb +54 -0
- data/{specs → spec}/cucumber/core_ext/string_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/ansicolor_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/color_io_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/html/cucumber.css +0 -0
- data/{specs → spec}/cucumber/formatter/html/cucumber.js +0 -0
- data/{specs → spec}/cucumber/formatter/html/index.html +0 -0
- data/{specs → spec}/cucumber/formatter/html/jquery-1.3.min.js +0 -0
- data/{specs → spec}/cucumber/formatter/html/jquery.uitableedit.js +0 -0
- data/{specs → spec}/cucumber/formatters/profile_formatter_spec.rb +0 -0
- data/{specs → spec}/cucumber/parser/feature_parser_spec.rb +43 -41
- data/{specs → spec}/cucumber/parser/table_parser_spec.rb +0 -0
- data/{specs → spec}/cucumber/rails/stubs/mini_rails.rb +0 -0
- data/{specs → spec}/cucumber/rails/stubs/test_help.rb +0 -0
- data/{specs → spec}/cucumber/rails/world_spec.rb +0 -0
- data/{specs → spec}/cucumber/sell_cucumbers.feature +0 -0
- data/{specs → spec}/cucumber/step_definition_spec.rb +0 -0
- data/{specs → spec}/cucumber/step_mother_spec.rb +63 -4
- data/{specs → spec}/cucumber/treetop_parser/empty_feature.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/empty_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/empty_scenario_outline.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/fit_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/given_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/invalid_scenario_outlines.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/multiline_steps.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/multiple_tables.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/scenario_outline.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/spaces.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/test_dos.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/with_comments.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/with_tags.feature +0 -0
- data/{specs → spec}/cucumber/world/pending_spec.rb +0 -0
- data/{specs → spec}/spec.opts +0 -0
- data/{specs → spec}/spec_helper.rb +2 -11
- metadata +72 -51
- data/examples/tickets/cucumber.yml +0 -3
- data/lib/cucumber/parser/basic.rb +0 -0
- data/specs/cucumber/ast/tags_spec.rb +0 -19
- data/specs/cucumber/core_ext/proc_spec.rb +0 -37
|
@@ -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
|
|
|
@@ -14,7 +26,4 @@ module NavigationHelpers
|
|
|
14
26
|
end
|
|
15
27
|
end
|
|
16
28
|
|
|
17
|
-
World
|
|
18
|
-
world.extend NavigationHelpers
|
|
19
|
-
world
|
|
20
|
-
end
|
|
29
|
+
World(NavigationHelpers)
|
|
@@ -106,6 +106,22 @@ Then /^I should not see "([^\"]*)"$/ do |text|
|
|
|
106
106
|
<% end -%>
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
+
Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
|
|
110
|
+
<% if framework == :rspec -%>
|
|
111
|
+
field_labeled(field).value.should =~ /#{value}/
|
|
112
|
+
<% else -%>
|
|
113
|
+
assert_match(/#{value}/, field_labeled(field).value)
|
|
114
|
+
<% end -%>
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
|
|
118
|
+
<% if framework == :rspec -%>
|
|
119
|
+
field_labeled(field).value.should_not =~ /#{value}/
|
|
120
|
+
<% else -%>
|
|
121
|
+
assert_no_match(/#{value}/, field_labeled(field).value)
|
|
122
|
+
<% end -%>
|
|
123
|
+
end
|
|
124
|
+
|
|
109
125
|
Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
|
|
110
126
|
<% if framework == :rspec -%>
|
|
111
127
|
field_labeled(label).should be_checked
|
|
@@ -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"]],
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
@@ -155,12 +155,12 @@ module Cucumber
|
|
|
155
155
|
it "should convert to sexp" do
|
|
156
156
|
@table.to_sexp.should ==
|
|
157
157
|
[:table,
|
|
158
|
-
[:row,
|
|
158
|
+
[:row, -1,
|
|
159
159
|
[:cell, "one"],
|
|
160
160
|
[:cell, "four"],
|
|
161
161
|
[:cell, "seven"]
|
|
162
162
|
],
|
|
163
|
-
[:row,
|
|
163
|
+
[:row, -1,
|
|
164
164
|
[:cell, "4444"],
|
|
165
165
|
[:cell, "55555"],
|
|
166
166
|
[:cell, "666666"]]]
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
require 'yaml'
|
|
3
|
-
|
|
3
|
+
begin
|
|
4
|
+
require 'spec/runner/differs/default' # RSpec >=1.2.4
|
|
5
|
+
rescue ::LoadError
|
|
6
|
+
require 'spec/expectations/differs/default' # RSpec <=1.2.3
|
|
7
|
+
end
|
|
4
8
|
|
|
5
9
|
module Cucumber
|
|
6
10
|
module Cli
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/core_ext/instance_exec'
|
|
3
|
+
|
|
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
|
+
|
|
10
|
+
it "should raise ArityMismatchError for too many args (expecting 0)" do
|
|
11
|
+
lambda {
|
|
12
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do
|
|
13
|
+
end
|
|
14
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should raise ArityMismatchError for too many args (expecting 1)" do
|
|
18
|
+
lambda {
|
|
19
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
|
|
20
|
+
end
|
|
21
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should raise ArityMismatchError for too few args (expecting 1)" do
|
|
25
|
+
lambda {
|
|
26
|
+
Object.new.cucumber_instance_exec(true, 'foo') do |a|
|
|
27
|
+
end
|
|
28
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should raise ArityMismatchError for too few args (expecting 2)" do
|
|
32
|
+
lambda {
|
|
33
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
|
|
34
|
+
end
|
|
35
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
|
|
36
|
+
end
|
|
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
|
|
53
|
+
end
|
|
54
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -27,8 +27,8 @@ module Cucumber
|
|
|
27
27
|
@step_mother.step_match("Three blind mice")
|
|
28
28
|
end.should raise_error(Ambiguous, %{Ambiguous match of "Three blind mice":
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
spec/cucumber/step_mother_spec.rb:23:in `/Three (.*) mice/'
|
|
31
|
+
spec/cucumber/step_mother_spec.rb:24:in `/Three blind (.*)/'
|
|
32
32
|
|
|
33
33
|
You can run again with --guess to make Cucumber be more smart about it
|
|
34
34
|
})
|
|
@@ -43,8 +43,8 @@ You can run again with --guess to make Cucumber be more smart about it
|
|
|
43
43
|
@step_mother.step_match("Three cute mice")
|
|
44
44
|
end.should raise_error(Ambiguous, %{Ambiguous match of "Three cute mice":
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
spec/cucumber/step_mother_spec.rb:39:in `/Three (.*) mice/'
|
|
47
|
+
spec/cucumber/step_mother_spec.rb:40:in `/Three cute (.*)/'
|
|
48
48
|
|
|
49
49
|
})
|
|
50
50
|
end
|
|
@@ -85,5 +85,64 @@ specs/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
|
|
136
|
+
|
|
137
|
+
it "should find before hooks" do
|
|
138
|
+
fish = @step_mother.Before('@fish'){}
|
|
139
|
+
meat = @step_mother.Before('@meat'){}
|
|
140
|
+
|
|
141
|
+
scenario = mock('Scenario')
|
|
142
|
+
scenario.should_receive(:accept_hook?).with(fish).and_return(true)
|
|
143
|
+
scenario.should_receive(:accept_hook?).with(meat).and_return(false)
|
|
144
|
+
|
|
145
|
+
@step_mother.hooks_for(:before, scenario).should == [fish]
|
|
146
|
+
end
|
|
88
147
|
end
|
|
89
148
|
end
|