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.
Files changed (127) hide show
  1. data/.rvmrc +1 -1
  2. data/.travis.yml +13 -6
  3. data/Gemfile +2 -0
  4. data/History.md +139 -0
  5. data/LICENSE +1 -1
  6. data/README.md +19 -4
  7. data/cucumber.gemspec +16 -29
  8. data/cucumber.yml +3 -3
  9. data/examples/i18n/README.textile +1 -16
  10. data/features/.cucumber/stepdefs.json +612 -0
  11. data/features/backtraces.feature +36 -0
  12. data/features/doc_strings.feature +73 -0
  13. data/features/drb_server_integration.feature +63 -0
  14. data/features/formatter_step_file_colon_line.feature +46 -0
  15. data/features/json_formatter.feature +137 -137
  16. data/features/nested_steps.feature +60 -0
  17. data/features/rerun_formatter.feature +35 -0
  18. data/features/run_specific_scenarios.feature +47 -0
  19. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +32 -3
  20. data/features/step_definitions/cucumber_steps.rb +15 -0
  21. data/features/step_definitions/drb_steps.rb +3 -0
  22. data/features/support/env.rb +4 -0
  23. data/features/support/feature_factory.rb +50 -0
  24. data/gem_tasks/cucumber.rake +15 -8
  25. data/gem_tasks/yard.rake +18 -0
  26. data/legacy_features/call_steps_from_stepdefs.feature +1 -1
  27. data/legacy_features/cucumber_cli.feature +0 -7
  28. data/legacy_features/default_snippets.feature +3 -2
  29. data/legacy_features/junit_formatter.feature +60 -10
  30. data/legacy_features/language_help.feature +17 -15
  31. data/legacy_features/snippets_when_using_star_keyword.feature +3 -2
  32. data/legacy_features/step_definitions/cucumber_steps.rb +1 -1
  33. data/legacy_features/support/env.rb +1 -1
  34. data/legacy_features/wire_protocol.feature +1 -1
  35. data/lib/cucumber/ast/background.rb +11 -0
  36. data/lib/cucumber/ast/doc_string.rb +10 -29
  37. data/lib/cucumber/ast/feature.rb +6 -2
  38. data/lib/cucumber/ast/feature_element.rb +7 -3
  39. data/lib/cucumber/ast/multiline_argument.rb +30 -0
  40. data/lib/cucumber/ast/outline_table.rb +20 -12
  41. data/lib/cucumber/ast/step.rb +1 -1
  42. data/lib/cucumber/ast/step_invocation.rb +2 -15
  43. data/lib/cucumber/ast/table.rb +67 -38
  44. data/lib/cucumber/ast/tags.rb +7 -7
  45. data/lib/cucumber/ast/tree_walker.rb +5 -5
  46. data/lib/cucumber/cli/configuration.rb +4 -0
  47. data/lib/cucumber/cli/main.rb +1 -0
  48. data/lib/cucumber/cli/options.rb +29 -10
  49. data/lib/cucumber/constantize.rb +1 -1
  50. data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +24 -10
  51. data/lib/cucumber/formatter/ansicolor.rb +8 -13
  52. data/lib/cucumber/formatter/console.rb +3 -2
  53. data/lib/cucumber/formatter/cucumber.css +7 -1
  54. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +6 -2
  55. data/lib/cucumber/formatter/html.rb +14 -8
  56. data/lib/cucumber/formatter/interceptor.rb +62 -0
  57. data/lib/cucumber/formatter/json.rb +0 -12
  58. data/lib/cucumber/formatter/junit.rb +31 -15
  59. data/lib/cucumber/formatter/pretty.rb +3 -3
  60. data/lib/cucumber/formatter/progress.rb +1 -1
  61. data/lib/cucumber/formatter/rerun.rb +31 -8
  62. data/lib/cucumber/formatter/usage.rb +1 -1
  63. data/lib/cucumber/js_support/js_language.rb +1 -1
  64. data/lib/cucumber/js_support/js_snippets.rb +1 -1
  65. data/lib/cucumber/language_support/language_methods.rb +0 -4
  66. data/lib/cucumber/parser/gherkin_builder.rb +13 -14
  67. data/lib/cucumber/platform.rb +1 -1
  68. data/lib/cucumber/py_support/py_language.rb +3 -7
  69. data/lib/cucumber/rb_support/rb_dsl.rb +15 -8
  70. data/lib/cucumber/rb_support/rb_language.rb +3 -17
  71. data/lib/cucumber/rb_support/rb_step_definition.rb +17 -5
  72. data/lib/cucumber/rb_support/rb_transform.rb +5 -2
  73. data/lib/cucumber/rb_support/rb_world.rb +9 -5
  74. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +3 -3
  75. data/lib/cucumber/runtime/results.rb +2 -2
  76. data/lib/cucumber/runtime/support_code.rb +14 -19
  77. data/lib/cucumber/runtime.rb +40 -2
  78. data/lib/cucumber/step_match.rb +3 -4
  79. data/lib/cucumber/term/ansicolor.rb +118 -0
  80. data/lib/cucumber/wire_support/wire_protocol/requests.rb +7 -5
  81. data/lib/cucumber/wire_support/wire_protocol.rb +0 -1
  82. data/lib/cucumber.rb +2 -1
  83. data/spec/cucumber/ast/doc_string_spec.rb +2 -2
  84. data/spec/cucumber/ast/feature_factory.rb +4 -3
  85. data/spec/cucumber/ast/scenario_outline_spec.rb +1 -2
  86. data/spec/cucumber/ast/step_spec.rb +1 -1
  87. data/spec/cucumber/ast/table_spec.rb +61 -27
  88. data/spec/cucumber/cli/configuration_spec.rb +12 -6
  89. data/spec/cucumber/cli/main_spec.rb +2 -2
  90. data/spec/cucumber/cli/options_spec.rb +9 -3
  91. data/spec/cucumber/constantize_spec.rb +16 -0
  92. data/spec/cucumber/formatter/ansicolor_spec.rb +1 -1
  93. data/spec/cucumber/formatter/html_spec.rb +4 -3
  94. data/spec/cucumber/formatter/interceptor_spec.rb +111 -0
  95. data/spec/cucumber/formatter/junit_spec.rb +36 -20
  96. data/spec/cucumber/formatter/progress_spec.rb +2 -2
  97. data/spec/cucumber/rb_support/rb_language_spec.rb +5 -5
  98. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +20 -4
  99. data/spec/cucumber/rb_support/rb_transform_spec.rb +6 -2
  100. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +7 -3
  101. data/spec/cucumber/runtime/results_spec.rb +81 -0
  102. data/spec/cucumber/step_match_spec.rb +8 -4
  103. data/spec/spec_helper.rb +15 -1
  104. metadata +68 -128
  105. data/.gitignore +0 -26
  106. data/.gitmodules +0 -3
  107. data/.yardopts +0 -0
  108. data/Gemfile.lock +0 -115
  109. data/examples/i18n/de/.gitignore +0 -1
  110. data/examples/i18n/en/.gitignore +0 -1
  111. data/examples/i18n/eo/.gitignore +0 -1
  112. data/examples/i18n/fi/.gitignore +0 -1
  113. data/examples/i18n/hu/.gitignore +0 -1
  114. data/examples/i18n/id/.gitignore +0 -1
  115. data/examples/i18n/ja/.gitignore +0 -1
  116. data/examples/i18n/ko/.gitignore +0 -1
  117. data/examples/i18n/lt/.gitignore +0 -1
  118. data/examples/i18n/pl/.gitignore +0 -1
  119. data/examples/i18n/sk/.gitignore +0 -1
  120. data/examples/i18n/tr/.gitignore +0 -1
  121. data/examples/i18n/zh-TW/.gitignore +0 -1
  122. data/examples/python/lib/.gitignore +0 -1
  123. data/examples/ruby2python/lib/.gitignore +0 -1
  124. data/examples/watir/.gitignore +0 -2
  125. data/fixtures/self_test/.gitignore +0 -1
  126. data/lib/cucumber/formatter/pdf.rb +0 -244
  127. 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} features/a_feature.feature", false
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
- code = <<-EOF
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
@@ -0,0 +1,3 @@
1
+ Given /^I am running spork in the background$/ do
2
+ run_spork_in_background
3
+ end
@@ -24,3 +24,7 @@ Before do
24
24
  # Set a longer timeout for aruba
25
25
  @aruba_timeout_seconds = 15
26
26
  end
27
+
28
+ After do
29
+ terminate_background_jobs
30
+ end
@@ -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)
@@ -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
- if(Cucumber::JRUBY)
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
- Given 'a multiline string:', "Hello\n#{s}"
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, just make sure a file
38
- with the appropriate file extension exists where cucumber looks for step definitions.
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.Passing" name="Passing" time="0.005">
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.Failing" name="Failing" time="0.005">
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.Passing" name="Passing" time="0.005">
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.Failing" name="Failing" time="0.005">
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.Pending" name="Pending" time="0.009">
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.Undefined" name="Undefined" time="0.009">
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.Pending" name="Pending" time="0.000160">
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.Undefined" name="Undefined" time="0.000160">
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.Using scenario outlines" name="Using scenario outlines (outline example : | passing |)" time="0.005">
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.Using scenario outlines" name="Using scenario outlines (outline example : | failing |)" time="0.005">
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, just make sure a file
33
- with the appropriate file extension exists where cucumber looks for step definitions.
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
- Then("it should #{success}")
78
+ step("it should #{success}")
79
79
  end
80
80
 
81
81
  Then /^the output should contain "([^"]*)"$/ do |text|
@@ -126,7 +126,7 @@ class CucumberWorld
126
126
  exec cmd
127
127
  end
128
128
  end
129
- sleep 1.0
129
+ sleep 2.0
130
130
  end
131
131
 
132
132
  def terminate_background_jobs
@@ -329,4 +329,4 @@ Feature: Wire Protocol
329
329
  Then STDERR should match
330
330
  """
331
331
  undefined method `handle_yikes'
332
- """
332
+ """
@@ -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
- def self.parse(text)
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
- @string = string
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
- @string
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(@string)
39
+ visitor.visit_doc_string(self)
59
40
  end
60
41
 
61
42
  def arguments_replaced(arguments) #:nodoc:
62
- string = @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
- @string.index(text)
52
+ index(text)
72
53
  end
73
54
 
74
55
  # For testing only
@@ -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
- @tags.tag_names
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(source_tag_names)
66
+ Gherkin::TagExpression.new(hook.tag_expressions).eval(source_tags)
67
67
  end
68
-
68
+
69
69
  def source_tag_names
70
- (@tags.tag_names.to_a + (@feature ? @feature.source_tag_names.to_a : [])).uniq
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