casecumber 1.0.2.1 → 1.2.1.cb2
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -1
- data/.travis.yml +13 -6
- data/Gemfile +2 -0
- data/History.md +139 -0
- data/LICENSE +1 -1
- data/README.md +19 -4
- data/cucumber.gemspec +16 -29
- data/cucumber.yml +3 -3
- data/examples/i18n/README.textile +1 -16
- data/features/.cucumber/stepdefs.json +612 -0
- data/features/backtraces.feature +36 -0
- data/features/doc_strings.feature +73 -0
- data/features/drb_server_integration.feature +63 -0
- data/features/formatter_step_file_colon_line.feature +46 -0
- data/features/json_formatter.feature +137 -137
- data/features/nested_steps.feature +60 -0
- data/features/rerun_formatter.feature +35 -0
- data/features/run_specific_scenarios.feature +47 -0
- data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +32 -3
- data/features/step_definitions/cucumber_steps.rb +15 -0
- data/features/step_definitions/drb_steps.rb +3 -0
- data/features/support/env.rb +4 -0
- data/features/support/feature_factory.rb +50 -0
- data/gem_tasks/cucumber.rake +15 -8
- data/gem_tasks/yard.rake +18 -0
- data/legacy_features/call_steps_from_stepdefs.feature +1 -1
- data/legacy_features/cucumber_cli.feature +0 -7
- data/legacy_features/default_snippets.feature +3 -2
- data/legacy_features/junit_formatter.feature +60 -10
- data/legacy_features/language_help.feature +17 -15
- data/legacy_features/snippets_when_using_star_keyword.feature +3 -2
- data/legacy_features/step_definitions/cucumber_steps.rb +1 -1
- data/legacy_features/support/env.rb +1 -1
- data/legacy_features/wire_protocol.feature +1 -1
- data/lib/cucumber/ast/background.rb +11 -0
- data/lib/cucumber/ast/doc_string.rb +10 -29
- data/lib/cucumber/ast/feature.rb +6 -2
- data/lib/cucumber/ast/feature_element.rb +7 -3
- data/lib/cucumber/ast/multiline_argument.rb +30 -0
- data/lib/cucumber/ast/outline_table.rb +20 -12
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +2 -15
- data/lib/cucumber/ast/table.rb +67 -38
- data/lib/cucumber/ast/tags.rb +7 -7
- data/lib/cucumber/ast/tree_walker.rb +5 -5
- data/lib/cucumber/cli/configuration.rb +4 -0
- data/lib/cucumber/cli/main.rb +1 -0
- data/lib/cucumber/cli/options.rb +29 -10
- data/lib/cucumber/constantize.rb +1 -1
- data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +24 -10
- data/lib/cucumber/formatter/ansicolor.rb +8 -13
- data/lib/cucumber/formatter/console.rb +3 -2
- data/lib/cucumber/formatter/cucumber.css +7 -1
- data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +6 -2
- data/lib/cucumber/formatter/html.rb +14 -8
- data/lib/cucumber/formatter/interceptor.rb +62 -0
- data/lib/cucumber/formatter/json.rb +0 -12
- data/lib/cucumber/formatter/junit.rb +31 -15
- data/lib/cucumber/formatter/pretty.rb +3 -3
- data/lib/cucumber/formatter/progress.rb +1 -1
- data/lib/cucumber/formatter/rerun.rb +31 -8
- data/lib/cucumber/formatter/usage.rb +1 -1
- data/lib/cucumber/js_support/js_language.rb +1 -1
- data/lib/cucumber/js_support/js_snippets.rb +1 -1
- data/lib/cucumber/language_support/language_methods.rb +0 -4
- data/lib/cucumber/parser/gherkin_builder.rb +13 -14
- data/lib/cucumber/platform.rb +1 -1
- data/lib/cucumber/py_support/py_language.rb +3 -7
- data/lib/cucumber/rb_support/rb_dsl.rb +15 -8
- data/lib/cucumber/rb_support/rb_language.rb +3 -17
- data/lib/cucumber/rb_support/rb_step_definition.rb +17 -5
- data/lib/cucumber/rb_support/rb_transform.rb +5 -2
- data/lib/cucumber/rb_support/rb_world.rb +9 -5
- data/lib/cucumber/rb_support/regexp_argument_matcher.rb +3 -3
- data/lib/cucumber/runtime/results.rb +2 -2
- data/lib/cucumber/runtime/support_code.rb +14 -19
- data/lib/cucumber/runtime.rb +40 -2
- data/lib/cucumber/step_match.rb +3 -4
- data/lib/cucumber/term/ansicolor.rb +118 -0
- data/lib/cucumber/wire_support/wire_protocol/requests.rb +7 -5
- data/lib/cucumber/wire_support/wire_protocol.rb +0 -1
- data/lib/cucumber.rb +2 -1
- data/spec/cucumber/ast/doc_string_spec.rb +2 -2
- data/spec/cucumber/ast/feature_factory.rb +4 -3
- data/spec/cucumber/ast/scenario_outline_spec.rb +1 -2
- data/spec/cucumber/ast/step_spec.rb +1 -1
- data/spec/cucumber/ast/table_spec.rb +61 -27
- data/spec/cucumber/cli/configuration_spec.rb +12 -6
- data/spec/cucumber/cli/main_spec.rb +2 -2
- data/spec/cucumber/cli/options_spec.rb +9 -3
- data/spec/cucumber/constantize_spec.rb +16 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +1 -1
- data/spec/cucumber/formatter/html_spec.rb +4 -3
- data/spec/cucumber/formatter/interceptor_spec.rb +111 -0
- data/spec/cucumber/formatter/junit_spec.rb +36 -20
- data/spec/cucumber/formatter/progress_spec.rb +2 -2
- data/spec/cucumber/rb_support/rb_language_spec.rb +5 -5
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +20 -4
- data/spec/cucumber/rb_support/rb_transform_spec.rb +6 -2
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +7 -3
- data/spec/cucumber/runtime/results_spec.rb +81 -0
- data/spec/cucumber/step_match_spec.rb +8 -4
- data/spec/spec_helper.rb +15 -1
- metadata +68 -128
- data/.gitignore +0 -26
- data/.gitmodules +0 -3
- data/.yardopts +0 -0
- data/Gemfile.lock +0 -115
- data/examples/i18n/de/.gitignore +0 -1
- data/examples/i18n/en/.gitignore +0 -1
- data/examples/i18n/eo/.gitignore +0 -1
- data/examples/i18n/fi/.gitignore +0 -1
- data/examples/i18n/hu/.gitignore +0 -1
- data/examples/i18n/id/.gitignore +0 -1
- data/examples/i18n/ja/.gitignore +0 -1
- data/examples/i18n/ko/.gitignore +0 -1
- data/examples/i18n/lt/.gitignore +0 -1
- data/examples/i18n/pl/.gitignore +0 -1
- data/examples/i18n/sk/.gitignore +0 -1
- data/examples/i18n/tr/.gitignore +0 -1
- data/examples/i18n/zh-TW/.gitignore +0 -1
- data/examples/python/lib/.gitignore +0 -1
- data/examples/ruby2python/lib/.gitignore +0 -1
- data/examples/watir/.gitignore +0 -2
- data/fixtures/self_test/.gitignore +0 -1
- data/lib/cucumber/formatter/pdf.rb +0 -244
- data/lib/cucumber/step_argument.rb +0 -9
@@ -7,8 +7,8 @@ module CucumberRubyMappings
|
|
7
7
|
run_simple "#{cucumber_bin} features/a_feature.feature --name '#{scenario_name}'", false
|
8
8
|
end
|
9
9
|
|
10
|
-
def run_feature
|
11
|
-
run_simple "#{cucumber_bin}
|
10
|
+
def run_feature(filename = 'features/a_feature.feature', formatter = 'progress')
|
11
|
+
run_simple "#{cucumber_bin} #{filename} --format #{formatter}", false
|
12
12
|
end
|
13
13
|
|
14
14
|
def cucumber_bin
|
@@ -54,7 +54,7 @@ EOF
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def write_calculator_code
|
57
|
-
|
57
|
+
code = <<-EOF
|
58
58
|
# http://en.wikipedia.org/wiki/Reverse_Polish_notation
|
59
59
|
class RpnCalculator
|
60
60
|
def initialize
|
@@ -163,6 +163,35 @@ EOF
|
|
163
163
|
def failed_output
|
164
164
|
"failed"
|
165
165
|
end
|
166
|
+
|
167
|
+
def run_spork_in_background(port = nil)
|
168
|
+
require 'spork'
|
169
|
+
|
170
|
+
pid = fork
|
171
|
+
in_current_dir do
|
172
|
+
if pid
|
173
|
+
background_jobs << pid
|
174
|
+
else
|
175
|
+
# STDOUT.close
|
176
|
+
# STDERR.close
|
177
|
+
port_arg = port ? "-p #{port}" : ''
|
178
|
+
cmd = "#{Cucumber::RUBY_BINARY} -I #{Cucumber::LIBDIR} #{Spork::BINARY} cuc #{port_arg}"
|
179
|
+
exec cmd
|
180
|
+
end
|
181
|
+
end
|
182
|
+
sleep 1.0
|
183
|
+
end
|
184
|
+
|
185
|
+
def background_jobs
|
186
|
+
@background_jobs ||= []
|
187
|
+
end
|
188
|
+
|
189
|
+
def terminate_background_jobs
|
190
|
+
background_jobs.each do |pid|
|
191
|
+
Process.kill(Signal.list['TERM'], pid)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
166
195
|
end
|
167
196
|
|
168
197
|
World(CucumberRubyMappings)
|
@@ -21,3 +21,18 @@ Given /^a directory without standard Cucumber project directory structure$/ do
|
|
21
21
|
FileUtils.rm_rf 'features' if File.directory?('features')
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
Given /^a scenario with a step that looks like this:$/ do |string|
|
26
|
+
create_feature do
|
27
|
+
create_scenario { string }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Given /^a step definition that looks like this:$/ do |string|
|
32
|
+
create_step_definition { string }
|
33
|
+
end
|
34
|
+
|
35
|
+
When /^I run the feature with the (\w+) formatter$/ do |formatter|
|
36
|
+
features.length.should == 1
|
37
|
+
run_feature features.first, formatter
|
38
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
module FeatureFactory
|
2
|
+
def create_feature(name = generate_feature_name)
|
3
|
+
gherkin = <<-GHERKIN
|
4
|
+
Feature: #{name}
|
5
|
+
#{yield}
|
6
|
+
GHERKIN
|
7
|
+
write_file filename(name), gherkin
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_scenario(name = generate_scenario_name)
|
11
|
+
<<-GHERKIN
|
12
|
+
Scenario: #{name}
|
13
|
+
#{yield}
|
14
|
+
GHERKIN
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_step_definition
|
18
|
+
write_file generate_step_definition_filename, yield
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_feature_name
|
22
|
+
"Test Feature #{next_increment(:feature)}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_scenario_name
|
26
|
+
"Test Scenario #{next_increment(:scenario)}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def next_increment(label)
|
30
|
+
@increments ||= {}
|
31
|
+
@increments[label] ||= 0
|
32
|
+
@increments[label] += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def generate_step_definition_filename
|
36
|
+
"features/step_definitions/test_steps#{next_increment(:step_defs)}.rb"
|
37
|
+
end
|
38
|
+
|
39
|
+
def filename(name)
|
40
|
+
"features/#{name.downcase.gsub(' ', '_')}.feature"
|
41
|
+
end
|
42
|
+
|
43
|
+
def features
|
44
|
+
in_current_dir do
|
45
|
+
Dir['features/*.feature']
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
World(FeatureFactory)
|
data/gem_tasks/cucumber.rake
CHANGED
@@ -1,21 +1,28 @@
|
|
1
1
|
require 'cucumber/rake/task'
|
2
2
|
require 'cucumber/platform'
|
3
3
|
|
4
|
+
class Cucumber::Rake::Task
|
5
|
+
def set_profile_for_current_ruby
|
6
|
+
self.profile = if(Cucumber::JRUBY)
|
7
|
+
Cucumber::WINDOWS ? 'jruby_win' : 'jruby'
|
8
|
+
elsif(Cucumber::WINDOWS_MRI)
|
9
|
+
'windows_mri'
|
10
|
+
elsif(Cucumber::RUBY_1_9)
|
11
|
+
'ruby_1_9'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
4
16
|
Cucumber::Rake::Task.new(:features) do |t|
|
5
17
|
t.fork = false
|
18
|
+
t.set_profile_for_current_ruby
|
6
19
|
end
|
7
20
|
|
8
21
|
Cucumber::Rake::Task.new(:legacy_features) do |t|
|
9
22
|
t.fork = false
|
10
23
|
t.cucumber_opts = %w{legacy_features}
|
11
|
-
|
12
|
-
t.profile = Cucumber::WINDOWS ? 'jruby_win' : 'jruby'
|
13
|
-
elsif(Cucumber::WINDOWS_MRI)
|
14
|
-
t.profile = 'windows_mri'
|
15
|
-
elsif(Cucumber::RUBY_1_9)
|
16
|
-
t.profile = 'ruby_1_9'
|
17
|
-
end
|
24
|
+
t.set_profile_for_current_ruby
|
18
25
|
t.rcov = ENV['RCOV']
|
19
26
|
end
|
20
27
|
|
21
|
-
task :cucumber => [:features, :legacy_features]
|
28
|
+
task :cucumber => [:features, :legacy_features]
|
data/gem_tasks/yard.rake
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'yard'
|
2
|
+
require 'yard/rake/yardoc_task'
|
3
|
+
require 'cucumber/platform'
|
4
|
+
|
5
|
+
YARD::Templates::Engine.register_template_path(File.expand_path(File.join(File.dirname(__FILE__), 'yard')))
|
6
|
+
YARD::Rake::YardocTask.new(:yard) do |t|
|
7
|
+
t.options = %w{--no-private --title Cucumber}
|
8
|
+
t.files = %w{lib - README.md History.md LICENSE}
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Push yardoc to http://cukes.info/cucumber/api/#{Cucumber::VERSION}"
|
12
|
+
task :push_yard => :yard do
|
13
|
+
sh("tar czf api-#{Cucumber::VERSION}.tgz -C doc .")
|
14
|
+
sh("scp api-#{Cucumber::VERSION}.tgz cukes.info:/var/www/cucumber/api/ruby")
|
15
|
+
sh("ssh cukes.info 'cd /var/www/cucumber/api/ruby && rm -rf #{Cucumber::VERSION} && mkdir #{Cucumber::VERSION} && tar xzf api-#{Cucumber::VERSION}.tgz -C #{Cucumber::VERSION} && rm -f latest && ln -s #{Cucumber::VERSION} latest'")
|
16
|
+
end
|
17
|
+
|
18
|
+
#task :release => :push_yard
|
@@ -46,7 +46,7 @@ Feature: http://gist.github.com/221223
|
|
46
46
|
end
|
47
47
|
|
48
48
|
Given /^I use keyword to call a multiline string with (.*)$/ do |s| x=1
|
49
|
-
|
49
|
+
step 'a multiline string:', "Hello\n#{s}"
|
50
50
|
end
|
51
51
|
|
52
52
|
Given /^I call a table with (.*)$/ do |s| x=1
|
@@ -551,13 +551,6 @@ Feature: Cucumber command line
|
|
551
551
|
|
552
552
|
"""
|
553
553
|
|
554
|
-
# Fails on 1.9 because of encoding issues.
|
555
|
-
@fails_on_1_9
|
556
|
-
Scenario: Generate PDF with pdf formatter
|
557
|
-
When I run cucumber --format pdf --out tmp/sample.pdf --dry-run features/sample.feature
|
558
|
-
Then STDERR should be empty
|
559
|
-
Then "fixtures/self_test/tmp/sample.pdf" should match "Pages 2"
|
560
|
-
|
561
554
|
Scenario: Run feature elements which match a name using -n
|
562
555
|
When I run cucumber -n Pisang -q features/
|
563
556
|
Then STDERR should be empty
|
@@ -34,8 +34,9 @@ Feature: Print snippets
|
|
34
34
|
pending # express the regexp above with the code you wish you had
|
35
35
|
end
|
36
36
|
|
37
|
-
If you want snippets in a different programming language,
|
38
|
-
with the appropriate file extension
|
37
|
+
If you want snippets in a different programming language,
|
38
|
+
just make sure a file with the appropriate file extension
|
39
|
+
exists where cucumber looks for step definitions.
|
39
40
|
|
40
41
|
|
41
42
|
"""
|
@@ -16,9 +16,11 @@ Feature: JUnit output formatter
|
|
16
16
|
"""
|
17
17
|
<?xml version="1.0" encoding="UTF-8"?>
|
18
18
|
<testsuite errors="0" failures="1" name="One passing scenario, one failing scenario" skipped="0" tests="2" time="0.005">
|
19
|
-
<testcase classname="One passing scenario, one failing scenario
|
19
|
+
<testcase classname="One passing scenario, one failing scenario" name="Passing" time="0.005">
|
20
|
+
<system-out/>
|
21
|
+
<system-err/>
|
20
22
|
</testcase>
|
21
|
-
<testcase classname="One passing scenario, one failing scenario
|
23
|
+
<testcase classname="One passing scenario, one failing scenario" name="Failing" time="0.005">
|
22
24
|
<failure message="failed Failing" type="failed">
|
23
25
|
<![CDATA[Scenario: Failing
|
24
26
|
|
@@ -29,7 +31,15 @@ Feature: JUnit output formatter
|
|
29
31
|
<![CDATA[ (RuntimeError)
|
30
32
|
features/one_passing_one_failing.feature:7:in `Given a failing scenario']]>
|
31
33
|
</failure>
|
34
|
+
<system-out/>
|
35
|
+
<system-err/>
|
32
36
|
</testcase>
|
37
|
+
<system-out>
|
38
|
+
<![CDATA[]]>
|
39
|
+
</system-out>
|
40
|
+
<system-err>
|
41
|
+
<![CDATA[]]>
|
42
|
+
</system-err>
|
33
43
|
</testsuite>
|
34
44
|
|
35
45
|
"""
|
@@ -44,9 +54,11 @@ Feature: JUnit output formatter
|
|
44
54
|
"""
|
45
55
|
<?xml version="1.0" encoding="UTF-8"?>
|
46
56
|
<testsuite errors="0" failures="1" name="Subdirectory - One passing scenario, one failing scenario" skipped="0" tests="2" time="0.005">
|
47
|
-
<testcase classname="Subdirectory - One passing scenario, one failing scenario
|
57
|
+
<testcase classname="Subdirectory - One passing scenario, one failing scenario" name="Passing" time="0.005">
|
58
|
+
<system-out/>
|
59
|
+
<system-err/>
|
48
60
|
</testcase>
|
49
|
-
<testcase classname="Subdirectory - One passing scenario, one failing scenario
|
61
|
+
<testcase classname="Subdirectory - One passing scenario, one failing scenario" name="Failing" time="0.005">
|
50
62
|
<failure message="failed Failing" type="failed">
|
51
63
|
<![CDATA[Scenario: Failing
|
52
64
|
|
@@ -57,7 +69,15 @@ Feature: JUnit output formatter
|
|
57
69
|
<![CDATA[ (RuntimeError)
|
58
70
|
features/some_subdirectory/one_passing_one_failing.feature:7:in `Given a failing scenario']]>
|
59
71
|
</failure>
|
72
|
+
<system-out/>
|
73
|
+
<system-err/>
|
60
74
|
</testcase>
|
75
|
+
<system-out>
|
76
|
+
<![CDATA[]]>
|
77
|
+
</system-out>
|
78
|
+
<system-err>
|
79
|
+
<![CDATA[]]>
|
80
|
+
</system-err>
|
61
81
|
</testsuite>
|
62
82
|
|
63
83
|
"""
|
@@ -72,12 +92,22 @@ Feature: JUnit output formatter
|
|
72
92
|
"""
|
73
93
|
<?xml version="1.0" encoding="UTF-8"?>
|
74
94
|
<testsuite errors="0" failures="0" name="Pending step" skipped="2" tests="2" time="0.009">
|
75
|
-
<testcase classname="Pending step
|
95
|
+
<testcase classname="Pending step" name="Pending" time="0.009">
|
76
96
|
<skipped/>
|
97
|
+
<system-out/>
|
98
|
+
<system-err/>
|
77
99
|
</testcase>
|
78
|
-
<testcase classname="Pending step
|
100
|
+
<testcase classname="Pending step" name="Undefined" time="0.009">
|
79
101
|
<skipped/>
|
102
|
+
<system-out/>
|
103
|
+
<system-err/>
|
80
104
|
</testcase>
|
105
|
+
<system-out>
|
106
|
+
<![CDATA[]]>
|
107
|
+
</system-out>
|
108
|
+
<system-err>
|
109
|
+
<![CDATA[]]>
|
110
|
+
</system-err>
|
81
111
|
</testsuite>
|
82
112
|
|
83
113
|
"""
|
@@ -92,7 +122,7 @@ Feature: JUnit output formatter
|
|
92
122
|
"""
|
93
123
|
<?xml version="1.0" encoding="UTF-8"?>
|
94
124
|
<testsuite errors="0" failures="2" name="Pending step" skipped="0" tests="2" time="0.000160">
|
95
|
-
<testcase classname="Pending step
|
125
|
+
<testcase classname="Pending step" name="Pending" time="0.000160">
|
96
126
|
<failure message="pending Pending" type="pending">
|
97
127
|
<![CDATA[Scenario: Pending
|
98
128
|
|
@@ -100,8 +130,10 @@ Feature: JUnit output formatter
|
|
100
130
|
<![CDATA[TODO (Cucumber::Pending)
|
101
131
|
features/pending.feature:4:in `Given a pending step']]>
|
102
132
|
</failure>
|
133
|
+
<system-out/>
|
134
|
+
<system-err/>
|
103
135
|
</testcase>
|
104
|
-
<testcase classname="Pending step
|
136
|
+
<testcase classname="Pending step" name="Undefined" time="0.000160">
|
105
137
|
<failure message="undefined Undefined" type="undefined">
|
106
138
|
<![CDATA[Scenario: Undefined
|
107
139
|
|
@@ -109,7 +141,15 @@ Feature: JUnit output formatter
|
|
109
141
|
<![CDATA[Undefined step: "an undefined step" (Cucumber::Undefined)
|
110
142
|
features/pending.feature:7:in `Given an undefined step']]>
|
111
143
|
</failure>
|
144
|
+
<system-out/>
|
145
|
+
<system-err/>
|
112
146
|
</testcase>
|
147
|
+
<system-out>
|
148
|
+
<![CDATA[]]>
|
149
|
+
</system-out>
|
150
|
+
<system-err>
|
151
|
+
<![CDATA[]]>
|
152
|
+
</system-err>
|
113
153
|
</testsuite>
|
114
154
|
|
115
155
|
"""
|
@@ -144,9 +184,11 @@ You \*must\* specify \-\-out DIR for the junit formatter
|
|
144
184
|
"""
|
145
185
|
<?xml version="1.0" encoding="UTF-8"?>
|
146
186
|
<testsuite errors="0" failures="1" name="Scenario outlines" skipped="0" tests="2" time="0.005">
|
147
|
-
<testcase classname="Scenario outlines
|
187
|
+
<testcase classname="Scenario outlines" name="Using scenario outlines (outline example : | passing |)" time="0.005">
|
188
|
+
<system-out/>
|
189
|
+
<system-err/>
|
148
190
|
</testcase>
|
149
|
-
<testcase classname="Scenario outlines
|
191
|
+
<testcase classname="Scenario outlines" name="Using scenario outlines (outline example : | failing |)" time="0.005">
|
150
192
|
<failure message="failed Using scenario outlines (outline example : | failing |)" type="failed">
|
151
193
|
<![CDATA[Scenario Outline: Using scenario outlines
|
152
194
|
|
@@ -157,7 +199,15 @@ You \*must\* specify \-\-out DIR for the junit formatter
|
|
157
199
|
<![CDATA[ (RuntimeError)
|
158
200
|
features/scenario_outline.feature:4:in `Given a <type> scenario']]>
|
159
201
|
</failure>
|
202
|
+
<system-out/>
|
203
|
+
<system-err/>
|
160
204
|
</testcase>
|
205
|
+
<system-out>
|
206
|
+
<![CDATA[]]>
|
207
|
+
</system-out>
|
208
|
+
<system-err>
|
209
|
+
<![CDATA[]]>
|
210
|
+
</system-err>
|
161
211
|
</testsuite>
|
162
212
|
|
163
213
|
"""
|
@@ -7,21 +7,21 @@ Feature: Language help
|
|
7
7
|
When I run cucumber --i18n pt help
|
8
8
|
Then it should pass with
|
9
9
|
"""
|
10
|
-
| feature | "Funcionalidade"
|
11
|
-
| background | "Contexto"
|
12
|
-
| scenario | "Cenário", "Cenario"
|
13
|
-
| scenario_outline | "Esquema do Cenário", "Esquema do Cenario" |
|
14
|
-
| examples | "Exemplos"
|
15
|
-
| given | "* ", "Dado "
|
16
|
-
| when | "* ", "Quando "
|
17
|
-
| then | "* ", "Então ", "Entao "
|
18
|
-
| and | "* ", "E "
|
19
|
-
| but | "* ", "Mas "
|
20
|
-
| given (code) | "Dado"
|
21
|
-
| when (code) | "Quando"
|
22
|
-
| then (code) | "Então", "Entao"
|
23
|
-
| and (code) | "E"
|
24
|
-
| but (code) | "Mas"
|
10
|
+
| feature | "Funcionalidade", "Característica", "Caracteristica" |
|
11
|
+
| background | "Contexto", "Cenário de Fundo", "Cenario de Fundo", "Fundo" |
|
12
|
+
| scenario | "Cenário", "Cenario" |
|
13
|
+
| scenario_outline | "Esquema do Cenário", "Esquema do Cenario", "Delineação do Cenário", "Delineacao do Cenario" |
|
14
|
+
| examples | "Exemplos", "Cenários", "Cenarios" |
|
15
|
+
| given | "* ", "Dado ", "Dada ", "Dados ", "Dadas " |
|
16
|
+
| when | "* ", "Quando " |
|
17
|
+
| then | "* ", "Então ", "Entao " |
|
18
|
+
| and | "* ", "E " |
|
19
|
+
| but | "* ", "Mas " |
|
20
|
+
| given (code) | "Dado", "Dada", "Dados", "Dadas" |
|
21
|
+
| when (code) | "Quando" |
|
22
|
+
| then (code) | "Então", "Entao" |
|
23
|
+
| and (code) | "E" |
|
24
|
+
| but (code) | "Mas" |
|
25
25
|
|
26
26
|
"""
|
27
27
|
Scenario: List languages
|
@@ -31,6 +31,7 @@ Feature: Language help
|
|
31
31
|
"""
|
32
32
|
| ar | Arabic | العربية |
|
33
33
|
| bg | Bulgarian | български |
|
34
|
+
| bm | Malay | Bahasa Melayu |
|
34
35
|
| ca | Catalan | català |
|
35
36
|
| cs | Czech | Česky |
|
36
37
|
| cy-GB | Welsh | Cymraeg |
|
@@ -51,6 +52,7 @@ Feature: Language help
|
|
51
52
|
| hr | Croatian | hrvatski |
|
52
53
|
| hu | Hungarian | magyar |
|
53
54
|
| id | Indonesian | Bahasa Indonesia |
|
55
|
+
| is | Icelandic | Íslenska |
|
54
56
|
| it | Italian | italiano |
|
55
57
|
| ja | Japanese | 日本語 |
|
56
58
|
| ko | Korean | 한국어 |
|
@@ -29,8 +29,9 @@ Feature: Use * keywords and still get snippets
|
|
29
29
|
pending # express the regexp above with the code you wish you had
|
30
30
|
end
|
31
31
|
|
32
|
-
If you want snippets in a different programming language,
|
33
|
-
with the appropriate file extension
|
32
|
+
If you want snippets in a different programming language,
|
33
|
+
just make sure a file with the appropriate file extension
|
34
|
+
exists where cucumber looks for step definitions.
|
34
35
|
|
35
36
|
|
36
37
|
"""
|
@@ -75,7 +75,7 @@ Then /^it should (fail|pass) with$/ do |success, output|
|
|
75
75
|
unless combined_output.index(output)
|
76
76
|
combined_output.should == output
|
77
77
|
end
|
78
|
-
|
78
|
+
step("it should #{success}")
|
79
79
|
end
|
80
80
|
|
81
81
|
Then /^the output should contain "([^"]*)"$/ do |text|
|
@@ -96,6 +96,17 @@ module Cucumber
|
|
96
96
|
end
|
97
97
|
|
98
98
|
|
99
|
+
# Override this method, as there are situations where the background
|
100
|
+
# wind up being the one called fore Before scenarios, and
|
101
|
+
# backgrounds don't have tags.
|
102
|
+
def source_tags
|
103
|
+
[]
|
104
|
+
end
|
105
|
+
|
106
|
+
def source_tag_names
|
107
|
+
source_tags.map { |tag| tag.name }
|
108
|
+
end
|
109
|
+
|
99
110
|
end
|
100
111
|
end
|
101
112
|
end
|
@@ -16,59 +16,40 @@ module Cucumber
|
|
16
16
|
#
|
17
17
|
# Note how the indentation from the source is stripped away.
|
18
18
|
#
|
19
|
-
class DocString #:nodoc:
|
20
|
-
class Builder
|
21
|
-
attr_reader :string
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
@string = ''
|
25
|
-
end
|
26
|
-
|
27
|
-
def doc_string(string, line_number)
|
28
|
-
@string = string
|
29
|
-
end
|
30
|
-
|
31
|
-
def eof
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
19
|
+
class DocString < String #:nodoc:
|
35
20
|
attr_accessor :file
|
36
21
|
|
37
22
|
def self.default_arg_name
|
38
23
|
"string"
|
39
24
|
end
|
40
25
|
|
41
|
-
|
42
|
-
builder = Builder.new
|
43
|
-
lexer = Gherkin::I18nLexer.new(builder)
|
44
|
-
lexer.scan(text)
|
45
|
-
new(builder.string)
|
46
|
-
end
|
26
|
+
attr_reader :content_type
|
47
27
|
|
48
|
-
def initialize(string)
|
49
|
-
@
|
28
|
+
def initialize(string, content_type)
|
29
|
+
@content_type = content_type
|
30
|
+
super string
|
50
31
|
end
|
51
32
|
|
52
33
|
def to_step_definition_arg
|
53
|
-
|
34
|
+
self
|
54
35
|
end
|
55
36
|
|
56
37
|
def accept(visitor)
|
57
38
|
return if Cucumber.wants_to_quit
|
58
|
-
visitor.visit_doc_string(
|
39
|
+
visitor.visit_doc_string(self)
|
59
40
|
end
|
60
41
|
|
61
42
|
def arguments_replaced(arguments) #:nodoc:
|
62
|
-
string =
|
43
|
+
string = self
|
63
44
|
arguments.each do |name, value|
|
64
45
|
value ||= ''
|
65
46
|
string = string.gsub(name, value)
|
66
47
|
end
|
67
|
-
DocString.new(string)
|
48
|
+
DocString.new(string, content_type)
|
68
49
|
end
|
69
50
|
|
70
51
|
def has_text?(text)
|
71
|
-
|
52
|
+
index(text)
|
72
53
|
end
|
73
54
|
|
74
55
|
# For testing only
|
data/lib/cucumber/ast/feature.rb
CHANGED
@@ -8,7 +8,7 @@ module Cucumber
|
|
8
8
|
|
9
9
|
attr_accessor :language
|
10
10
|
attr_writer :features, :background
|
11
|
-
attr_reader :file
|
11
|
+
attr_reader :file, :feature_elements
|
12
12
|
|
13
13
|
def initialize(background, comment, tags, keyword, title, description, feature_elements)
|
14
14
|
@background, @comment, @tags, @keyword, @title, @description, @feature_elements = background, comment, tags, keyword, title, description, feature_elements
|
@@ -53,8 +53,12 @@ module Cucumber
|
|
53
53
|
end.join("\n")
|
54
54
|
end
|
55
55
|
|
56
|
+
def source_tags
|
57
|
+
@tags.tags
|
58
|
+
end
|
59
|
+
|
56
60
|
def source_tag_names
|
57
|
-
|
61
|
+
source_tags.map { |tag| tag.name }
|
58
62
|
end
|
59
63
|
|
60
64
|
def accept_hook?(hook)
|
@@ -63,11 +63,15 @@ module Cucumber
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def accept_hook?(hook)
|
66
|
-
Gherkin::TagExpression.new(hook.tag_expressions).eval(
|
66
|
+
Gherkin::TagExpression.new(hook.tag_expressions).eval(source_tags)
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def source_tag_names
|
70
|
-
|
70
|
+
source_tags.map { |tag| tag.name }
|
71
|
+
end
|
72
|
+
|
73
|
+
def source_tags
|
74
|
+
(@tags.tags.to_a + (@feature ? @feature.source_tags.to_a : [])).uniq
|
71
75
|
end
|
72
76
|
|
73
77
|
def language
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'gherkin/rubify'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module Ast
|
5
|
+
module MultilineArgument
|
6
|
+
|
7
|
+
class << self
|
8
|
+
include Gherkin::Rubify
|
9
|
+
|
10
|
+
def from(argument)
|
11
|
+
return unless argument
|
12
|
+
return argument if argument.respond_to?(:to_step_definition_arg)
|
13
|
+
|
14
|
+
case(rubify(argument))
|
15
|
+
when String
|
16
|
+
# TODO: this duplicates work that gherkin does. We should really pass the string to gherkin and let it parse it.
|
17
|
+
Ast::DocString.new(argument, '')
|
18
|
+
when Gherkin::Formatter::Model::DocString
|
19
|
+
Ast::DocString.new(argument.value, argument.content_type)
|
20
|
+
when Array
|
21
|
+
Ast::Table.new(argument.map{|row| row.cells})
|
22
|
+
else
|
23
|
+
raise ArgumentError, "Don't know how to convert #{argument} into a MultilineArgument"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|