cucumber 1.2.5 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +14 -6
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +2 -2
- data/History.md +38 -2
- data/bin/cucumber +2 -11
- data/cucumber.gemspec +3 -3
- data/cucumber.yml +5 -1
- data/examples/test_unit/Gemfile +4 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
- data/examples/watir/README.textile +2 -2
- data/examples/watir/features/support/env.rb +10 -7
- data/features/.cucumber/stepdefs.json +747 -1354
- data/features/assertions.feature +6 -2
- data/features/background.feature +3 -0
- data/features/backtraces.feature +3 -3
- data/features/before_hook.feature +43 -0
- data/features/bootstrap.feature +14 -2
- data/features/custom_formatter.feature +1 -1
- data/features/drb_server_integration.feature +3 -3
- data/features/formatter_callbacks.feature +2 -2
- data/features/formatter_step_file_colon_line.feature +1 -1
- data/features/html_formatter.feature +52 -1
- data/features/json_formatter.feature +93 -7
- data/features/load_path.feature +14 -0
- data/features/nested_steps.feature +75 -3
- data/features/nested_steps_i18n.feature +36 -0
- data/features/pretty_formatter.feature +31 -0
- data/features/progress_formatter.feature +31 -0
- data/features/raketask.feature +51 -0
- data/features/rerun_formatter.feature +1 -1
- data/features/stats_formatters.feature +17 -14
- data/features/step_definitions/cucumber_steps.rb +6 -4
- data/features/support/env.rb +31 -4
- data/features/support/feature_factory.rb +17 -0
- data/features/tagged_hooks.feature +37 -195
- data/features/transforms.feature +15 -15
- data/gem_tasks/cucumber.rake +2 -0
- data/gem_tasks/yard.rake +10 -6
- data/legacy_features/README.md +14 -0
- data/legacy_features/language_help.feature +3 -1
- data/legacy_features/report_called_undefined_steps.feature +1 -0
- data/legacy_features/snippets_when_using_star_keyword.feature +1 -0
- data/legacy_features/support/env.rb +4 -0
- data/lib/cucumber/ast/background.rb +35 -35
- data/lib/cucumber/ast/empty_background.rb +33 -0
- data/lib/cucumber/ast/examples.rb +5 -2
- data/lib/cucumber/ast/feature.rb +24 -35
- data/lib/cucumber/ast/features.rb +4 -1
- data/lib/cucumber/ast/has_steps.rb +9 -17
- data/lib/cucumber/ast/location.rb +41 -0
- data/lib/cucumber/ast/scenario.rb +37 -50
- data/lib/cucumber/ast/scenario_outline.rb +62 -49
- data/lib/cucumber/ast/step.rb +23 -27
- data/lib/cucumber/ast/step_collection.rb +16 -0
- data/lib/cucumber/ast/step_invocation.rb +4 -1
- data/lib/cucumber/ast/tree_walker.rb +7 -0
- data/lib/cucumber/cli/configuration.rb +15 -3
- data/lib/cucumber/cli/main.rb +24 -11
- data/lib/cucumber/cli/options.rb +24 -16
- data/lib/cucumber/configuration.rb +4 -0
- data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +10 -34
- data/lib/cucumber/core_ext/instance_exec.rb +4 -1
- data/lib/cucumber/core_ext/proc.rb +2 -0
- data/lib/cucumber/feature_file.rb +5 -12
- data/lib/cucumber/formatter/console.rb +10 -0
- data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +4 -4
- data/lib/cucumber/formatter/html.rb +7 -42
- data/lib/cucumber/formatter/interceptor.rb +4 -0
- data/lib/cucumber/formatter/json_pretty.rb +0 -4
- data/lib/cucumber/formatter/junit.rb +8 -2
- data/lib/cucumber/formatter/pretty.rb +5 -1
- data/lib/cucumber/formatter/progress.rb +4 -0
- data/lib/cucumber/formatter/unicode.rb +12 -25
- data/lib/cucumber/formatter/usage.rb +7 -2
- data/lib/cucumber/js_support/js_snippets.rb +1 -1
- data/lib/cucumber/load_path.rb +13 -0
- data/lib/cucumber/parser/gherkin_builder.rb +237 -81
- data/lib/cucumber/platform.rb +1 -1
- data/lib/cucumber/py_support/py_language.rb +1 -1
- data/lib/cucumber/rake/task.rb +5 -1
- data/lib/cucumber/rb_support/rb_language.rb +20 -19
- data/lib/cucumber/rb_support/rb_world.rb +63 -21
- data/lib/cucumber/rb_support/snippet.rb +108 -0
- data/lib/cucumber/runtime.rb +1 -0
- data/lib/cucumber/runtime/support_code.rb +2 -2
- data/lib/cucumber/unit.rb +11 -0
- data/lib/cucumber/wire_support/wire_language.rb +1 -1
- data/spec/cucumber/ast/background_spec.rb +13 -6
- data/spec/cucumber/ast/feature_factory.rb +20 -10
- data/spec/cucumber/ast/features_spec.rb +51 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +13 -7
- data/spec/cucumber/ast/step_spec.rb +6 -4
- data/spec/cucumber/cli/configuration_spec.rb +34 -1
- data/spec/cucumber/cli/main_spec.rb +36 -26
- data/spec/cucumber/cli/options_spec.rb +28 -19
- data/spec/cucumber/core_ext/proc_spec.rb +13 -1
- data/spec/cucumber/formatter/interceptor_spec.rb +8 -0
- data/spec/cucumber/formatter/junit_spec.rb +33 -0
- data/spec/cucumber/formatter/pretty_spec.rb +391 -0
- data/spec/cucumber/rb_support/rb_language_spec.rb +21 -50
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +2 -4
- data/spec/cucumber/rb_support/snippet_spec.rb +128 -0
- data/spec/cucumber/step_match_spec.rb +2 -6
- metadata +62 -113
- data/.rvmrc +0 -1
- data/features/hooks.feature +0 -59
- data/legacy_features/call_steps_from_stepdefs.feature +0 -154
@@ -26,14 +26,25 @@ module Cucumber
|
|
26
26
|
%w{4444 55555 666666}
|
27
27
|
])
|
28
28
|
doc_string = Ast::DocString.new(%{\n I like\nCucumber sandwich\n}, '')
|
29
|
+
location = Ast::Location.new('foo.feature', 2)
|
30
|
+
language = stub.as_null_object
|
29
31
|
|
30
|
-
background = Ast::Background.new(
|
32
|
+
background = Ast::Background.new(
|
33
|
+
language,
|
34
|
+
location,
|
35
|
+
Ast::Comment.new(""),
|
36
|
+
"Background:",
|
37
|
+
"",
|
38
|
+
"",
|
31
39
|
[
|
32
|
-
Step.new(3, "Given", "a passing step")
|
40
|
+
Step.new(language, location.on_line(3), "Given", "a passing step")
|
33
41
|
]
|
34
42
|
)
|
35
43
|
|
36
|
-
|
44
|
+
location = Location.new('features/pretty_printing.feature', 0)
|
45
|
+
|
46
|
+
Ast::Feature.new(
|
47
|
+
location,
|
37
48
|
background,
|
38
49
|
Ast::Comment.new("# My feature comment\n"),
|
39
50
|
Ast::Tags.new(6, [Gherkin::Formatter::Model::Tag.new('one', 6), Gherkin::Formatter::Model::Tag.new('two', 6)]),
|
@@ -41,21 +52,20 @@ module Cucumber
|
|
41
52
|
"Pretty printing",
|
42
53
|
"",
|
43
54
|
[Ast::Scenario.new(
|
55
|
+
language,
|
56
|
+
location.on_line(9),
|
44
57
|
background,
|
45
58
|
Ast::Comment.new(" # My scenario comment \n# On two lines \n"),
|
46
59
|
Ast::Tags.new(8, [Gherkin::Formatter::Model::Tag.new('three', 8), Gherkin::Formatter::Model::Tag.new('four', 8)]),
|
47
|
-
|
60
|
+
Ast::Tags.new(1, []),
|
48
61
|
"Scenario:", "A Scenario", "",
|
49
62
|
[
|
50
|
-
Step.new(10, "Given", "a passing step with an inline arg:", table),
|
51
|
-
Step.new(11, "Given", "a happy step with an inline arg:", doc_string),
|
52
|
-
Step.new(12, "Given", "a failing step")
|
63
|
+
Step.new(language, location.on_line(10), "Given", "a passing step with an inline arg:", table),
|
64
|
+
Step.new(language, location.on_line(11), "Given", "a happy step with an inline arg:", doc_string),
|
65
|
+
Step.new(language, location.on_line(12), "Given", "a failing step")
|
53
66
|
]
|
54
67
|
)]
|
55
68
|
)
|
56
|
-
f.file = 'features/pretty_printing.feature'
|
57
|
-
f.features = Features.new
|
58
|
-
f
|
59
69
|
end
|
60
70
|
end
|
61
71
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'cucumber/ast/feature_factory'
|
3
|
+
|
4
|
+
module Cucumber
|
5
|
+
module Ast
|
6
|
+
describe Features do
|
7
|
+
it "has a step_count" do
|
8
|
+
parse_feature(<<-GHERKIN)
|
9
|
+
Feature:
|
10
|
+
Background:
|
11
|
+
Given step 1
|
12
|
+
And step 2
|
13
|
+
|
14
|
+
Scenario:
|
15
|
+
Given step 3
|
16
|
+
And step 4
|
17
|
+
And step 5
|
18
|
+
|
19
|
+
Scenario Outline:
|
20
|
+
Given step <n>
|
21
|
+
And another step
|
22
|
+
|
23
|
+
Examples:
|
24
|
+
| n |
|
25
|
+
| 6 |
|
26
|
+
| 7 |
|
27
|
+
|
28
|
+
Examples:
|
29
|
+
| n |
|
30
|
+
| 8 |
|
31
|
+
GHERKIN
|
32
|
+
|
33
|
+
features.step_count.should == (2 + 3) + (3 * (2 + 2))
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_feature(gherkin)
|
37
|
+
path = 'features/test.feature'
|
38
|
+
builder = Cucumber::Parser::GherkinBuilder.new(path)
|
39
|
+
parser = Gherkin::Parser::Parser.new(builder, true, "root", false)
|
40
|
+
parser.parse(gherkin, path, 0)
|
41
|
+
builder.language = parser.i18n_language
|
42
|
+
feature = builder.result
|
43
|
+
features.add_feature(feature)
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:features) { Features.new }
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -26,23 +26,28 @@ module Cucumber
|
|
26
26
|
@eaten.should == n.to_i
|
27
27
|
end
|
28
28
|
|
29
|
+
location = Ast::Location.new('foo.feature', 19)
|
30
|
+
language = stub
|
31
|
+
|
29
32
|
@scenario_outline = ScenarioOutline.new(
|
30
|
-
|
33
|
+
language,
|
34
|
+
location,
|
35
|
+
background=Ast::EmptyBackground.new,
|
31
36
|
Comment.new(""),
|
32
37
|
Tags.new(18, []),
|
33
|
-
|
38
|
+
Tags.new(0, []),
|
34
39
|
"Scenario:", "My outline", "",
|
35
40
|
[
|
36
|
-
Step.new(20, 'Given', 'there are <start> cucumbers'),
|
37
|
-
Step.new(21, 'When', 'I eat <eat> cucumbers'),
|
38
|
-
Step.new(22, 'Then', 'I should have <left> cucumbers'),
|
39
|
-
Step.new(23, 'And', 'I should have <eat> cucumbers in my belly')
|
41
|
+
Step.new(language, location.on_line(20), 'Given', 'there are <start> cucumbers'),
|
42
|
+
Step.new(language, location.on_line(21), 'When', 'I eat <eat> cucumbers'),
|
43
|
+
Step.new(language, location.on_line(22), 'Then', 'I should have <left> cucumbers'),
|
44
|
+
Step.new(language, location.on_line(23), 'And', 'I should have <eat> cucumbers in my belly')
|
40
45
|
],
|
41
46
|
[
|
42
47
|
[
|
43
48
|
[
|
49
|
+
location.on_line(24),
|
44
50
|
Comment.new("#Mmmm... cucumbers\n"),
|
45
|
-
24,
|
46
51
|
'Examples:',
|
47
52
|
'First table',
|
48
53
|
'',
|
@@ -61,6 +66,7 @@ module Cucumber
|
|
61
66
|
it "should replace all variables and call outline once for each table row" do
|
62
67
|
visitor = TreeWalker.new(@step_mother)
|
63
68
|
visitor.should_receive(:visit_table_row).exactly(3).times
|
69
|
+
@scenario_outline.feature = stub.as_null_object
|
64
70
|
visitor.visit_feature_element(@scenario_outline)
|
65
71
|
end
|
66
72
|
end
|
@@ -6,8 +6,10 @@ require 'cucumber/core_ext/string'
|
|
6
6
|
module Cucumber
|
7
7
|
module Ast
|
8
8
|
describe Step do
|
9
|
+
let(:language) { stub }
|
10
|
+
|
9
11
|
it "should replace arguments in name" do
|
10
|
-
step = Step.new(1, 'Given', 'a <color> cucumber')
|
12
|
+
step = Step.new(language, 1, 'Given', 'a <color> cucumber')
|
11
13
|
|
12
14
|
invocation_table = Table.new([
|
13
15
|
%w{color taste},
|
@@ -20,7 +22,7 @@ module Cucumber
|
|
20
22
|
end
|
21
23
|
|
22
24
|
it "should use empty string for the replacement of arguments in name when replace value is nil" do
|
23
|
-
step = Step.new(1, 'Given', 'a <color>cucumber')
|
25
|
+
step = Step.new(language, 1, 'Given', 'a <color>cucumber')
|
24
26
|
|
25
27
|
invocation_table = Table.new([
|
26
28
|
['color'],
|
@@ -35,7 +37,7 @@ module Cucumber
|
|
35
37
|
it "should replace arguments in table arg" do
|
36
38
|
arg_table = Table.new([%w{taste_<taste> color_<color>}])
|
37
39
|
|
38
|
-
step = Step.new(1, 'Given', 'a <color> cucumber', arg_table)
|
40
|
+
step = Step.new(language, 1, 'Given', 'a <color> cucumber', arg_table)
|
39
41
|
|
40
42
|
invocation_table = Table.new([
|
41
43
|
%w{color taste},
|
@@ -50,7 +52,7 @@ module Cucumber
|
|
50
52
|
it "should replace arguments in py string arg" do
|
51
53
|
doc_string = DocString.new('taste_<taste> color_<color>', '')
|
52
54
|
|
53
|
-
step = Step.new(1, 'Given', 'a <color> cucumber', doc_string)
|
55
|
+
step = Step.new(language, 1, 'Given', 'a <color> cucumber', doc_string)
|
54
56
|
|
55
57
|
invocation_table = Table.new([
|
56
58
|
%w{color taste},
|
@@ -127,6 +127,7 @@ module Cli
|
|
127
127
|
end
|
128
128
|
|
129
129
|
context '--profile' do
|
130
|
+
include RSpec::WorkInProgress
|
130
131
|
|
131
132
|
it "expands args from profiles in the cucumber.yml file" do
|
132
133
|
given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
|
@@ -151,7 +152,7 @@ module Cli
|
|
151
152
|
end
|
152
153
|
|
153
154
|
it "parses ERB syntax in the cucumber.yml file" do
|
154
|
-
given_cucumber_yml_defined_as
|
155
|
+
given_cucumber_yml_defined_as("---\ndefault: \"<%=\"--require some_file\"%>\"\n")
|
155
156
|
|
156
157
|
config.parse!([])
|
157
158
|
config.options[:require].should include('some_file')
|
@@ -309,6 +310,11 @@ END_OF_MESSAGE
|
|
309
310
|
end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
|
310
311
|
end
|
311
312
|
|
313
|
+
it "should accept same --format options with implicit STDOUT, and keep only one" do
|
314
|
+
config.parse!(%w{--format pretty --format pretty})
|
315
|
+
config.formats.should == [["pretty", out]]
|
316
|
+
end
|
317
|
+
|
312
318
|
it "should not accept multiple --out streams pointing to the same place" do
|
313
319
|
lambda do
|
314
320
|
config.parse!(%w{--format pretty --out file1 --format progress --out file1})
|
@@ -320,6 +326,16 @@ END_OF_MESSAGE
|
|
320
326
|
config.formats.should == [["progress", "file1"], ["profile" ,"file2"]]
|
321
327
|
end
|
322
328
|
|
329
|
+
it "should accept same --format options with same --out streams and keep only one" do
|
330
|
+
config.parse!(%w{--format html --out file --format pretty --format html --out file})
|
331
|
+
config.formats.should == [["pretty", out], ["html", "file"]]
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should accept same --format options with different --out streams" do
|
335
|
+
config.parse!(%w{--format html --out file1 --format html --out file2})
|
336
|
+
config.formats.should == [["html", "file1"], ["html", "file2"]]
|
337
|
+
end
|
338
|
+
|
323
339
|
it "should accept --color option" do
|
324
340
|
Cucumber::Term::ANSIColor.should_receive(:coloring=).with(true)
|
325
341
|
config.parse!(['--color'])
|
@@ -434,6 +450,23 @@ END_OF_MESSAGE
|
|
434
450
|
config.dry_run?.should be_false
|
435
451
|
end
|
436
452
|
end
|
453
|
+
|
454
|
+
describe "#snippet_type" do
|
455
|
+
it "returns the snippet type when it was set" do
|
456
|
+
config.parse!(["--snippet-type", "classic"])
|
457
|
+
config.snippet_type.should eql :classic
|
458
|
+
end
|
459
|
+
|
460
|
+
it "returns the snippet type when it was set with shorthand option" do
|
461
|
+
config.parse!(["-I", "classic"])
|
462
|
+
config.snippet_type.should eql :classic
|
463
|
+
end
|
464
|
+
|
465
|
+
it "returns the default snippet type if it was not set" do
|
466
|
+
config.parse!([])
|
467
|
+
config.snippet_type.should eql :regexp
|
468
|
+
end
|
469
|
+
end
|
437
470
|
end
|
438
471
|
end
|
439
472
|
end
|
@@ -7,17 +7,16 @@ module Cucumber
|
|
7
7
|
module Cli
|
8
8
|
describe Main do
|
9
9
|
before(:each) do
|
10
|
-
@out = StringIO.new
|
11
|
-
@err = StringIO.new
|
12
|
-
Kernel.stub!(:exit).and_return(nil)
|
13
10
|
File.stub!(:exist?).and_return(false) # When Configuration checks for cucumber.yml
|
14
11
|
Dir.stub!(:[]).and_return([]) # to prevent cucumber's features dir to being laoded
|
15
12
|
end
|
16
13
|
|
17
|
-
let(:args)
|
18
|
-
let(:
|
19
|
-
let(:
|
20
|
-
|
14
|
+
let(:args) { [] }
|
15
|
+
let(:stdin) { StringIO.new }
|
16
|
+
let(:stdout) { StringIO.new }
|
17
|
+
let(:stderr) { StringIO.new }
|
18
|
+
let(:kernel) { mock(:kernel) }
|
19
|
+
subject { Main.new(args, stdin, stdout, stderr, kernel)}
|
21
20
|
|
22
21
|
describe "#execute!" do
|
23
22
|
context "passed an existing runtime" do
|
@@ -31,6 +30,7 @@ module Cucumber
|
|
31
30
|
expected_configuration = double('Configuration', :drb? => false).as_null_object
|
32
31
|
Configuration.stub!(:new => expected_configuration)
|
33
32
|
existing_runtime.should_receive(:configure).with(expected_configuration)
|
33
|
+
kernel.should_receive(:exit).with(1)
|
34
34
|
do_execute
|
35
35
|
end
|
36
36
|
|
@@ -38,7 +38,8 @@ module Cucumber
|
|
38
38
|
expected_results = double('results', :failure? => true)
|
39
39
|
existing_runtime.should_receive(:run!)
|
40
40
|
existing_runtime.stub!(:results).and_return(expected_results)
|
41
|
-
|
41
|
+
kernel.should_receive(:exit).with(1)
|
42
|
+
do_execute
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
@@ -54,7 +55,8 @@ module Cucumber
|
|
54
55
|
runtime.stub(:results).and_return(results)
|
55
56
|
|
56
57
|
Cucumber.wants_to_quit = true
|
57
|
-
|
58
|
+
kernel.should_receive(:exit).with(1)
|
59
|
+
subject.execute!
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
@@ -62,19 +64,22 @@ module Cucumber
|
|
62
64
|
describe "verbose mode" do
|
63
65
|
|
64
66
|
before(:each) do
|
65
|
-
b = Cucumber::Parser::GherkinBuilder.new
|
66
|
-
|
67
|
+
b = Cucumber::Parser::GherkinBuilder.new('features/foo.feature')
|
68
|
+
b.feature(Gherkin::Formatter::Model::Feature.new([], [], "Feature", "Foo", "", 99, ""))
|
69
|
+
b.language = stub
|
70
|
+
@empty_feature = b.result
|
67
71
|
end
|
68
72
|
|
69
73
|
it "should show feature files parsed" do
|
70
|
-
|
71
|
-
|
74
|
+
cli = Main.new(%w{--verbose example.feature}, stdin, stdout, stderr, kernel)
|
75
|
+
cli.stub!(:require)
|
72
76
|
|
73
77
|
Cucumber::FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
|
74
78
|
|
75
|
-
|
79
|
+
kernel.should_receive(:exit).with(0)
|
80
|
+
cli.execute!
|
76
81
|
|
77
|
-
|
82
|
+
stdout.string.should include('example.feature')
|
78
83
|
end
|
79
84
|
|
80
85
|
end
|
@@ -82,7 +87,7 @@ module Cucumber
|
|
82
87
|
describe "--format with class" do
|
83
88
|
describe "in module" do
|
84
89
|
it "should resolve each module until it gets Formatter class" do
|
85
|
-
cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass},
|
90
|
+
cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, stdin, stdout, stderr, kernel)
|
86
91
|
mock_module = mock('module')
|
87
92
|
Object.stub!(:const_defined?).and_return(true)
|
88
93
|
mock_module.stub!(:const_defined?).and_return(true)
|
@@ -97,6 +102,7 @@ module Cucumber
|
|
97
102
|
mock_module.should_receive(:const_get).with('MonkeyFormatterClass', false).and_return(mock('formatter class', :new => f))
|
98
103
|
end
|
99
104
|
|
105
|
+
kernel.should_receive(:exit).with(0)
|
100
106
|
cli.execute!
|
101
107
|
end
|
102
108
|
end
|
@@ -104,13 +110,12 @@ module Cucumber
|
|
104
110
|
|
105
111
|
[ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
|
106
112
|
|
107
|
-
it "rescues #{exception_klass}, prints the message to the error stream
|
113
|
+
it "rescues #{exception_klass}, prints the message to the error stream" do
|
108
114
|
Configuration.stub!(:new).and_return(configuration = mock('configuration'))
|
109
115
|
configuration.stub!(:parse!).and_raise(exception_klass.new("error message"))
|
110
116
|
|
111
|
-
|
112
|
-
|
113
|
-
error.string.should == "error message\n"
|
117
|
+
subject.execute!
|
118
|
+
stderr.string.should == "error message\n"
|
114
119
|
end
|
115
120
|
end
|
116
121
|
|
@@ -119,16 +124,20 @@ module Cucumber
|
|
119
124
|
@configuration = mock('Configuration', :drb? => true, :dotcucumber => false).as_null_object
|
120
125
|
Configuration.stub!(:new).and_return(@configuration)
|
121
126
|
|
122
|
-
|
127
|
+
args = ['features']
|
123
128
|
|
124
|
-
|
125
|
-
|
126
|
-
|
129
|
+
step_mother = mock('StepMother').as_null_object
|
130
|
+
StepMother.stub!(:new).and_return(step_mother)
|
131
|
+
|
132
|
+
@cli = Main.new(args, stdin, stdout, stderr, kernel)
|
127
133
|
end
|
128
134
|
|
129
135
|
it "delegates the execution to the DRB client passing the args and streams" do
|
130
136
|
@configuration.stub :drb_port => 1450
|
131
|
-
DRbClient.should_receive(:run)
|
137
|
+
DRbClient.should_receive(:run) do
|
138
|
+
kernel.exit(1)
|
139
|
+
end
|
140
|
+
kernel.should_receive(:exit).with(1)
|
132
141
|
@cli.execute!
|
133
142
|
end
|
134
143
|
|
@@ -147,8 +156,9 @@ module Cucumber
|
|
147
156
|
before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
|
148
157
|
|
149
158
|
it "alerts the user that execution will be performed locally" do
|
159
|
+
kernel.should_receive(:exit).with(1)
|
150
160
|
@cli.execute!
|
151
|
-
|
161
|
+
stderr.string.should include("WARNING: error message. Running features locally:")
|
152
162
|
end
|
153
163
|
|
154
164
|
end
|
@@ -123,25 +123,6 @@ module Cli
|
|
123
123
|
|
124
124
|
context '-p PROFILE or --profile PROFILE' do
|
125
125
|
|
126
|
-
it "notifies the user that an individual profile is being used" do
|
127
|
-
given_cucumber_yml_defined_as({'foo' => [1,2,3]})
|
128
|
-
options.parse!(%w{--profile foo})
|
129
|
-
output_stream.string.should =~ /Using the foo profile...\n/
|
130
|
-
end
|
131
|
-
|
132
|
-
it "notifies the user when multiple profiles are being used" do
|
133
|
-
given_cucumber_yml_defined_as({'foo' => [1,2,3], 'bar' => ['v'], 'dog' => ['v']})
|
134
|
-
options.parse!(%w{--profile foo --profile bar --profile dog})
|
135
|
-
output_stream.string.should =~ /Using the foo, bar and dog profiles...\n/
|
136
|
-
end
|
137
|
-
|
138
|
-
it "notifies the user of all profiles being used, even when they are nested" do
|
139
|
-
given_cucumber_yml_defined_as('foo' => '-p bar', 'bar' => 'features')
|
140
|
-
after_parsing('-p foo') do
|
141
|
-
output_stream.string.should =~ /Using the foo and bar profiles.../
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
126
|
it "uses the default profile passed in during initialization if none are specified by the user" do
|
146
127
|
given_cucumber_yml_defined_as({'default' => '--require some_file'})
|
147
128
|
|
@@ -223,6 +204,25 @@ module Cli
|
|
223
204
|
options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
|
224
205
|
end
|
225
206
|
|
207
|
+
it "only reads cucumber.yml once" do
|
208
|
+
original_parse_count = $cucumber_yml_read_count
|
209
|
+
$cucumber_yml_read_count = 0
|
210
|
+
|
211
|
+
begin
|
212
|
+
given_cucumber_yml_defined_as(<<-END
|
213
|
+
<% $cucumber_yml_read_count += 1 %>
|
214
|
+
default: --format pretty
|
215
|
+
END
|
216
|
+
)
|
217
|
+
options = Options.new(output_stream, error_stream, :default_profile => 'default')
|
218
|
+
options.parse!(%w(-f progress))
|
219
|
+
|
220
|
+
$cucumber_yml_read_count.should == 1
|
221
|
+
ensure
|
222
|
+
$cucumber_yml_read_count = original_parse_count
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
226
|
it "respects --quiet when defined in the profile" do
|
227
227
|
given_cucumber_yml_defined_as('foo' => '-q')
|
228
228
|
options.parse!(%w[-p foo])
|
@@ -289,6 +289,15 @@ module Cli
|
|
289
289
|
options[:paths].should == ['my_feature.feature']
|
290
290
|
end
|
291
291
|
end
|
292
|
+
|
293
|
+
context '--snippet-type' do
|
294
|
+
it "parses the snippet type argument" do
|
295
|
+
after_parsing('--snippet-type classic') do
|
296
|
+
options[:snippet_type].should eql :classic
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
292
301
|
end
|
293
302
|
|
294
303
|
describe '#expanded_args_without_drb' do
|