aslakhellesoy-cucumber 0.2.3 → 0.2.3.1

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.
Files changed (35) hide show
  1. data/History.txt +10 -1
  2. data/Manifest.txt +8 -0
  3. data/examples/i18n/sk/Rakefile +6 -0
  4. data/examples/i18n/sk/features/addition.feature +16 -0
  5. data/examples/i18n/sk/features/division.feature +9 -0
  6. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  7. data/examples/i18n/sk/lib/calculator.rb +14 -0
  8. data/examples/self_test/features/background/background_with_name.feature +7 -0
  9. data/examples/self_test/features/step_definitions/sample_steps.rb +6 -0
  10. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  11. data/features/background.feature +17 -0
  12. data/features/cucumber_cli.feature +18 -5
  13. data/features/snippet.feature +23 -0
  14. data/features/step_definitions/cucumber_steps.rb +6 -2
  15. data/features/usage.feature +5 -0
  16. data/lib/cucumber/ast/background.rb +3 -3
  17. data/lib/cucumber/ast/py_string.rb +5 -1
  18. data/lib/cucumber/ast/step_invocation.rb +4 -0
  19. data/lib/cucumber/ast/table.rb +4 -0
  20. data/lib/cucumber/core_ext/instance_exec.rb +17 -4
  21. data/lib/cucumber/formatter/console.rb +2 -1
  22. data/lib/cucumber/formatter/html.rb +5 -1
  23. data/lib/cucumber/formatter/pretty.rb +0 -4
  24. data/lib/cucumber/formatter/usage.rb +16 -0
  25. data/lib/cucumber/parser/feature.rb +93 -79
  26. data/lib/cucumber/parser/feature.tt +3 -2
  27. data/lib/cucumber/step_definition.rb +4 -2
  28. data/lib/cucumber/step_mother.rb +17 -2
  29. data/lib/cucumber/version.rb +1 -1
  30. data/specs/cucumber/ast/background_spec.rb +1 -0
  31. data/specs/cucumber/ast/feature_factory.rb +1 -1
  32. data/specs/cucumber/core_ext/proc_spec.rb +25 -8
  33. data/specs/cucumber/step_mother_spec.rb +13 -0
  34. data/specs/spec_helper.rb +2 -11
  35. metadata +10 -2
data/History.txt CHANGED
@@ -1,3 +1,12 @@
1
+ == 0.2.4 (In Git)
2
+
3
+ === New features
4
+ * The usage formatter also prints unused step definitions (Aslak Hellesøy)
5
+ * Better exception if a World proc returns nil. (Aslak Hellesøy)
6
+ * Allow Step Definitions to use |*varargs|, but only on Ruby 1.9. (Aslak Hellesøy)
7
+ * Snippets for steps that use Step Tables or Pystrings include block param and object type hint comment (#247 Joseph Wilk)
8
+ * Support description string for Backgrounds (#271 Joseph Wilk)
9
+
1
10
  == 0.2.3 2009-03-30
2
11
 
3
12
  This release sports 4 updated languages, slightly better help with snippets if you "quote" arguments
@@ -16,7 +25,7 @@ in your steps. Windows/JRuby users can enjoy colours and you get some more sugar
16
25
 
17
26
  === Bugfixes
18
27
  * Fixed step name after step keyword without space (#265 Aslak Hellesøy)
19
- * Backtrace is back in HTML reports
28
+ * Backtrace is back in HTML reports (Aslak Hellesøy)
20
29
 
21
30
  == 0.2.2 2009-03-25
22
31
 
data/Manifest.txt CHANGED
@@ -108,6 +108,11 @@ examples/i18n/se/Rakefile
108
108
  examples/i18n/se/features/step_definitons/kalkulator_steps.rb
109
109
  examples/i18n/se/features/summering.feature
110
110
  examples/i18n/se/lib/kalkulator.rb
111
+ examples/i18n/sk/Rakefile
112
+ examples/i18n/sk/features/addition.feature
113
+ examples/i18n/sk/features/division.feature
114
+ examples/i18n/sk/features/step_definitons/calculator_steps.rb
115
+ examples/i18n/sk/lib/calculator.rb
111
116
  examples/i18n/zh-CN/Rakefile
112
117
  examples/i18n/zh-CN/features/addition.feature
113
118
  examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb
@@ -135,6 +140,7 @@ examples/selenium_webrat/features/step_definitons/search_steps.rb
135
140
  examples/selenium_webrat/features/support/env.rb
136
141
  examples/self_test/README.textile
137
142
  examples/self_test/Rakefile
143
+ examples/self_test/features/background/background_with_name.feature
138
144
  examples/self_test/features/background/failing_background.feature
139
145
  examples/self_test/features/background/failing_background_after_success.feature
140
146
  examples/self_test/features/background/multiline_args_background.feature
@@ -151,6 +157,7 @@ examples/self_test/features/step_definitions/sample_steps.rb
151
157
  examples/self_test/features/support/env.rb
152
158
  examples/self_test/features/support/tag_count_formatter.rb
153
159
  examples/self_test/features/tons_of_cukes.feature
160
+ examples/self_test/features/undefined_multiline_args.feature
154
161
  examples/sinatra/Rakefile
155
162
  examples/sinatra/app.rb
156
163
  examples/sinatra/features/add.feature
@@ -191,6 +198,7 @@ features/cucumber_cli_diff_disabled.feature
191
198
  features/cucumber_cli_outlines.feature
192
199
  features/custom_formatter.feature
193
200
  features/report_called_undefined_steps.feature
201
+ features/snippet.feature
194
202
  features/step_definitions/cucumber_steps.rb
195
203
  features/step_definitions/extra_steps.rb
196
204
  features/support/env.rb
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
2
+ require 'cucumber/rake/task'
3
+
4
+ Cucumber::Rake::Task.new do |t|
5
+ t.cucumber_opts = "--language sk"
6
+ end
@@ -0,0 +1,16 @@
1
+ Požiadavka: Sčítavanie
2
+ Aby som sa vyhol hlúpym chybám
3
+ Ako matematický idiot
4
+ Chcem vedieť ako sa sčítavajú dve čísla
5
+
6
+ Náčrt Scenáru: Sčítanie dvoch čísel
7
+ Pokiaľ Zadám číslo <vstup_1> do kalkulačky
8
+ A Zadám číslo <vstup_2> do kalkulačky
9
+ Keď Stlačím tlačidlo <tlačidlo>
10
+ Tak Výsledok by mal byť <výstup>
11
+
12
+ Príklady:
13
+ | vstup_1 | vstup_2 | tlačidlo | výstup |
14
+ | 20 | 30 | add | 50 |
15
+ | 2 | 5 | add | 7 |
16
+ | 0 | 40 | add | 40 |
@@ -0,0 +1,9 @@
1
+ Požiadavka: Delenie
2
+ Aby som sa vyhol hlúpym chybám
3
+ Pokladníci musia vedieť vypočítať podiel
4
+
5
+ Scenár: Prirodzené čísla
6
+ Pokiaľ Zadám číslo 3 do kalkulačky
7
+ A Zadám číslo 2 do kalkulačky
8
+ Keď Stlačím tlačidlo divide
9
+ Tak Výsledok by mal byť 1.5
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ require 'spec/expectations'
3
+ $:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
4
+ require 'cucumber/formatter/unicode'
5
+ require 'calculator'
6
+
7
+ Before do
8
+ @calc = Calculator.new
9
+ end
10
+
11
+ After do
12
+ end
13
+
14
+ Given /Zadám číslo (\d+) do kalkulačky/ do |n|
15
+ @calc.push n.to_i
16
+ end
17
+
18
+ When /Stlačím tlačidlo (\w+)/ do |op|
19
+ @result = @calc.send op
20
+ end
21
+
22
+ Then /Výsledok by mal byť (.*)/ do |result|
23
+ @result.should == result.to_f
24
+ end
@@ -0,0 +1,14 @@
1
+ class Calculator
2
+ def push(n)
3
+ @args ||= []
4
+ @args << n
5
+ end
6
+
7
+ def add
8
+ @args.inject(0){|n,sum| sum+=n}
9
+ end
10
+
11
+ def divide
12
+ @args[0].to_f / @args[1].to_f
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ Feature: background with name
2
+
3
+ Background: I'm a background and I'm ok
4
+ Given '10' cukes
5
+
6
+ Scenario: example
7
+ Then I should have '10' cukes
@@ -62,3 +62,9 @@ end
62
62
  Given /^failing expectation$/ do
63
63
  'this'.should == 'that'
64
64
  end
65
+
66
+ Given /^unused$/ do
67
+ end
68
+
69
+ Given /^another unused$/ do
70
+ end
@@ -0,0 +1,12 @@
1
+ Feature: undefined multiline args
2
+
3
+ Scenario: pystring
4
+ Given a pystring
5
+ """
6
+ example
7
+ """
8
+
9
+ Scenario: table
10
+ Given a table
11
+ | table |
12
+ |example|
@@ -217,5 +217,22 @@ Feature: backgrounds
217
217
 
218
218
  """
219
219
 
220
+ Scenario: background with name
221
+ When I run cucumber -q features/background/background_with_name.feature --require features
222
+ Then it should pass with
223
+ """
224
+ Feature: background with name
225
+
226
+ Background: I'm a background and I'm ok
227
+ Given '10' cukes
228
+
229
+ Scenario: example
230
+ Then I should have '10' cukes
231
+
232
+ 1 scenario
233
+ 2 passed steps
234
+
235
+ """
236
+
220
237
  @josephwilk
221
238
  Scenario: run a scenario showing explicit background steps --explicit-background
@@ -229,15 +229,28 @@ Feature: Cucumber command line
229
229
  hello
230
230
  \"\"\"
231
231
 
232
- 12 scenarios
232
+ Feature: undefined multiline args
233
+
234
+ Scenario: pystring
235
+ Given a pystring
236
+ \"\"\"
237
+ example
238
+ \"\"\"
239
+
240
+ Scenario: table
241
+ Given a table
242
+ | table |
243
+ | example |
244
+
245
+ 14 scenarios
233
246
  12 skipped steps
234
- 7 undefined steps
247
+ 9 undefined steps
235
248
 
236
249
  """
237
250
 
238
251
  Scenario: Multiple formatters and outputs
239
252
  When I run cucumber --format progress --out tmp/progress.txt --format pretty --out tmp/pretty.txt --dry-run features/lots_of_undefined.feature
240
- And examples/self_test/tmp/progress.txt should contain
253
+ And "examples/self_test/tmp/progress.txt" should contain
241
254
  """
242
255
  UUUUU
243
256
 
@@ -245,7 +258,7 @@ Feature: Cucumber command line
245
258
  5 undefined steps
246
259
 
247
260
  """
248
- And examples/self_test/tmp/pretty.txt should match
261
+ And "examples/self_test/tmp/pretty.txt" should match
249
262
  """
250
263
  Feature: Lots of undefined
251
264
 
@@ -362,7 +375,7 @@ Feature: Cucumber command line
362
375
 
363
376
  Scenario: Reformat files with --autoformat
364
377
  When I run cucumber --autoformat tmp/formatted features
365
- Then examples/self_test/tmp/formatted/features/sample.feature should contain
378
+ Then "examples/self_test/tmp/formatted/features/sample.feature" should contain
366
379
  """
367
380
  @one
368
381
  Feature: Sample
@@ -0,0 +1,23 @@
1
+ Feature: Snippets
2
+ In order to help speed up writing step definitions
3
+ As a feature editor
4
+ I want snippet suggestions for undefined step definitions
5
+
6
+ Scenario: Snippet for undefined step with a pystring
7
+ When I run cucumber features/undefined_multiline_args.feature:3 -n
8
+ Then the output should contain
9
+ """
10
+ Given /^a pystring$/ do |string|
11
+ # string is a Cucumber::Ast::PyString
12
+ pending
13
+ end
14
+ """
15
+ Scenario: Snippet for undefined step with a step table
16
+ When I run cucumber features/undefined_multiline_args.feature:9 -n
17
+ Then the output should contain
18
+ """
19
+ Given /^a table$/ do |table|
20
+ # table is a Cucumber::Ast::Table
21
+ pending
22
+ end
23
+ """
@@ -21,10 +21,14 @@ Then /^it should (fail|pass) with$/ do |success, output|
21
21
  end
22
22
  end
23
23
 
24
- Then /^(.*) should contain$/ do |file, text|
24
+ Then /^the output should contain$/ do |text|
25
+ @out.should include(text)
26
+ end
27
+
28
+ Then /^"(.*)" should contain$/ do |file, text|
25
29
  IO.read(file).should == text
26
30
  end
27
31
 
28
- Then /^(.*) should match$/ do |file, text|
32
+ Then /^"(.*)" should match$/ do |file, text|
29
33
  IO.read(file).should =~ Regexp.new(text)
30
34
  end
@@ -19,6 +19,7 @@ Feature: Cucumber command line
19
19
  /^call step "(.*)"$/ # features/step_definitions/sample_steps.rb:23
20
20
  Given call step "a step definition that calls an undefined step" # features/call_undefined_step_from_step_def.feature:7
21
21
  /^'(.+)' cukes$/ # features/step_definitions/sample_steps.rb:27
22
+ Given '10' cukes # features/background/background_with_name.feature:4
22
23
  And '10' cukes # features/background/failing_background.feature:5
23
24
  Given '10' cukes # features/background/passing_background.feature:4
24
25
  Given '10' cukes # features/background/scenario_outline_passing_background.feature:4
@@ -72,6 +73,7 @@ Feature: Cucumber command line
72
73
  Given '2' cukes # features/tons_of_cukes.feature:51
73
74
  Given '2' cukes # features/tons_of_cukes.feature:52
74
75
  /^I should have '(.+)' cukes$/ # features/step_definitions/sample_steps.rb:31
76
+ Then I should have '10' cukes # features/background/background_with_name.feature:7
75
77
  Then I should have '10' cukes # features/background/failing_background.feature:8
76
78
  Then I should have '10' cukes # features/background/failing_background.feature:11
77
79
  Then I should have '10' cukes # features/background/passing_background.feature:7
@@ -103,6 +105,9 @@ Feature: Cucumber command line
103
105
  Given failing expectation # features/failing_expectation.feature:4
104
106
  /^failing$/ # features/step_definitions/sample_steps.rb:8
105
107
  Given failing # features/sample.feature:16
108
+ (::) UNUSED (::)
109
+ /^unused$/ # features/step_definitions/sample_steps.rb:66
110
+ /^another unused$/ # features/step_definitions/sample_steps.rb:69
106
111
 
107
112
  """
108
113
 
@@ -6,8 +6,8 @@ module Cucumber
6
6
  include FeatureElement
7
7
  attr_writer :feature
8
8
 
9
- def initialize(comment, line, keyword, steps)
10
- @comment, @line, @keyword, @steps = comment, line, keyword, StepCollection.new(steps)
9
+ def initialize(comment, line, keyword, name, steps)
10
+ @comment, @line, @keyword, @name, @steps = comment, line, keyword, name, StepCollection.new(steps)
11
11
  attach_steps(steps)
12
12
  @step_invocations = @steps.step_invocations(true)
13
13
  end
@@ -23,7 +23,7 @@ module Cucumber
23
23
 
24
24
  def accept(visitor)
25
25
  visitor.visit_comment(@comment)
26
- visitor.visit_background_name(@keyword, "", file_colon_line(@line), source_indent(text_length))
26
+ visitor.visit_background_name(@keyword, @name, file_colon_line(@line), source_indent(text_length))
27
27
  visitor.step_mother.before_and_after(self)
28
28
  visitor.visit_steps(@step_invocations)
29
29
  @failed = @step_invocations.detect{|step_invocation| step_invocation.exception}
@@ -17,6 +17,11 @@ module Cucumber
17
17
  # Note how the indentation from the source is stripped away.
18
18
  #
19
19
  class PyString
20
+
21
+ def self.default_arg_name
22
+ "string"
23
+ end
24
+
20
25
  def initialize(start_line, end_line, string, quotes_indent)
21
26
  @start_line, @end_line = start_line, end_line
22
27
  @string, @quotes_indent = string.gsub(/\\"/, '"'), quotes_indent
@@ -52,7 +57,6 @@ module Cucumber
52
57
  def to_sexp #:nodoc:
53
58
  [:py_string, to_s]
54
59
  end
55
-
56
60
  end
57
61
  end
58
62
  end
@@ -98,6 +98,10 @@ module Cucumber
98
98
  @step.keyword
99
99
  end
100
100
 
101
+ def multiline_arg
102
+ @step.multiline_arg
103
+ end
104
+
101
105
  def file_colon_line
102
106
  @step.file_colon_line
103
107
  end
@@ -12,6 +12,10 @@ module Cucumber
12
12
 
13
13
  attr_accessor :file
14
14
 
15
+ def self.default_arg_name
16
+ "table"
17
+ end
18
+
15
19
  def initialize(raw, conversions = NULL_CONVERSIONS.dup)
16
20
  # Verify that it's square
17
21
  raw.transpose
@@ -7,12 +7,14 @@ end
7
7
 
8
8
  class Object
9
9
  def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
10
- arity = block.arity
11
- arity = 0 if arity == -1
12
10
  cucumber_run_with_backtrace_filtering(pseudo_method) do
13
- if check_arity && args.length != arity
11
+ if check_arity && !cucumber_compatible_arity?(args, block)
14
12
  instance_exec do
15
- raise Cucumber::ArityMismatchError.new("expected #{arity} block argument(s), got #{args.length}")
13
+ s1 = cucumber_arity(block) == 1 ? "" : "s"
14
+ s2 = args.length == 1 ? "" : "s"
15
+ raise Cucumber::ArityMismatchError.new(
16
+ "Your block takes #{cucumber_arity(block)} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
17
+ )
16
18
  end
17
19
  else
18
20
  instance_exec(*args, &block)
@@ -20,6 +22,17 @@ class Object
20
22
  end
21
23
  end
22
24
 
25
+ def cucumber_arity(block)
26
+ a = block.arity
27
+ Cucumber::RUBY_1_9 ? a : (a == -1 ? 0 : a)
28
+ end
29
+
30
+ def cucumber_compatible_arity?(args, block)
31
+ a = cucumber_arity(block)
32
+ return true if (a == -1) && Cucumber::RUBY_1_9
33
+ a == args.length
34
+ end
35
+
23
36
  def cucumber_run_with_backtrace_filtering(pseudo_method)
24
37
  begin
25
38
  yield
@@ -74,7 +74,8 @@ module Cucumber
74
74
  return if undefined.empty?
75
75
  snippets = undefined.map do |step|
76
76
  step_name = Undefined === step.exception ? step.exception.step_name : step.name
77
- snippet = @step_mother.snippet_text(step.actual_keyword, step_name)
77
+ step_multiline_class = step.multiline_arg ? step.multiline_arg.class : nil
78
+ snippet = @step_mother.snippet_text(step.actual_keyword, step_name, step_multiline_class)
78
79
  snippet
79
80
  end.compact.uniq
80
81
 
@@ -74,9 +74,11 @@ module Cucumber
74
74
  end
75
75
 
76
76
  def visit_outline_table(outline_table)
77
+ @outline_row = 0
77
78
  @builder.table do
78
79
  super(outline_table)
79
80
  end
81
+ @outline_row = nil
80
82
  end
81
83
 
82
84
  def visit_examples_name(keyword, name)
@@ -145,10 +147,12 @@ module Cucumber
145
147
  end
146
148
  end
147
149
  end
150
+ @outline_row += 1 if @outline_row
148
151
  end
149
152
 
150
153
  def visit_table_cell_value(value, width, status)
151
- @builder.td(value, :class => status, :id => "#{@row_id}_#{@col_index}")
154
+ cell_type = @outline_row == 0 ? :th : :td
155
+ @builder.__send__(cell_type, value, :class => status, :id => "#{@row_id}_#{@col_index}")
152
156
  @col_index += 1
153
157
  end
154
158
 
@@ -157,10 +157,6 @@ module Cucumber
157
157
  @io.flush
158
158
  end
159
159
 
160
- def visit_table_cell(table_cell)
161
- super
162
- end
163
-
164
160
  def visit_table_cell_value(value, width, status)
165
161
  @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + " #{@delim}")
166
162
  @io.flush
@@ -10,6 +10,7 @@ module Cucumber
10
10
  @io = io
11
11
  @options = options
12
12
  @step_definitions = Hash.new { |h,step_definition| h[step_definition] = [] }
13
+ @all_step_definitions = step_mother.step_definitions.dup
13
14
  @locations = []
14
15
  end
15
16
 
@@ -32,6 +33,7 @@ module Cucumber
32
33
  description = format_step(keyword, step_match, status, nil)
33
34
  length = (keyword + step_match.format_args).jlength
34
35
  @step_definitions[step_match.step_definition] << [step_match, description, length, location]
36
+ @all_step_definitions.delete(step_match.step_definition)
35
37
  end
36
38
  end
37
39
 
@@ -63,6 +65,20 @@ module Cucumber
63
65
  @io.puts format_string(" # #{file_colon_line}".indent(max_length - length), :comment)
64
66
  end
65
67
  end
68
+
69
+ print_unused_step_definitions
70
+ end
71
+
72
+ def print_unused_step_definitions
73
+ if @all_step_definitions.any?
74
+ max_length = @all_step_definitions.map{|step_definition| step_definition.text_length}.max
75
+
76
+ @io.puts format_string("(::) UNUSED (::)", :failed)
77
+ @all_step_definitions.each do |step_definition|
78
+ @io.print format_string(step_definition.regexp.inspect, :failed)
79
+ @io.puts format_string(" # #{step_definition.file_colon_line}".indent(max_length - step_definition.text_length), :comment)
80
+ end
81
+ end
66
82
  end
67
83
  end
68
84
  end
@@ -118,12 +118,12 @@ module Cucumber
118
118
  r8 = nil
119
119
  else
120
120
  self.index = i8
121
- r8 = SyntaxNode.new(input, index...index)
121
+ r8 = instantiate_node(SyntaxNode,input, index...index)
122
122
  end
123
123
  s7 << r8
124
124
  if r8
125
125
  if index < input_length
126
- r13 = (SyntaxNode).new(input, index...(index + 1))
126
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
127
127
  @index += 1
128
128
  else
129
129
  terminal_parse_failure("any character")
@@ -132,7 +132,7 @@ module Cucumber
132
132
  s7 << r13
133
133
  end
134
134
  if s7.last
135
- r7 = (SyntaxNode).new(input, i7...index, s7)
135
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
136
136
  r7.extend(Feature0)
137
137
  else
138
138
  self.index = i7
@@ -144,14 +144,14 @@ module Cucumber
144
144
  break
145
145
  end
146
146
  end
147
- r6 = SyntaxNode.new(input, i6...index, s6)
147
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
148
148
  s0 << r6
149
149
  if r6
150
150
  r15 = _nt_background
151
151
  if r15
152
152
  r14 = r15
153
153
  else
154
- r14 = SyntaxNode.new(input, index...index)
154
+ r14 = instantiate_node(SyntaxNode,input, index...index)
155
155
  end
156
156
  s0 << r14
157
157
  if r14
@@ -162,7 +162,7 @@ module Cucumber
162
162
  if r18
163
163
  r17 = r18
164
164
  else
165
- r17 = SyntaxNode.new(input, index...index)
165
+ r17 = instantiate_node(SyntaxNode,input, index...index)
166
166
  end
167
167
  s0 << r17
168
168
  end
@@ -174,7 +174,7 @@ module Cucumber
174
174
  end
175
175
  end
176
176
  if s0.last
177
- r0 = (SyntaxNode).new(input, i0...index, s0)
177
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
178
178
  r0.extend(Feature1)
179
179
  r0.extend(Feature2)
180
180
  else
@@ -254,12 +254,12 @@ module Cucumber
254
254
  self.index = i5
255
255
  r5 = nil
256
256
  else
257
- r5 = SyntaxNode.new(input, i5...index, s5)
257
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
258
258
  end
259
259
  s3 << r5
260
260
  end
261
261
  if s3.last
262
- r3 = (SyntaxNode).new(input, i3...index, s3)
262
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
263
263
  r3.extend(Tags0)
264
264
  else
265
265
  self.index = i3
@@ -271,11 +271,11 @@ module Cucumber
271
271
  break
272
272
  end
273
273
  end
274
- r2 = SyntaxNode.new(input, i2...index, s2)
274
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
275
275
  s0 << r2
276
276
  end
277
277
  if s0.last
278
- r0 = (SyntaxNode).new(input, i0...index, s0)
278
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
279
279
  r0.extend(Tags1)
280
280
  r0.extend(Tags2)
281
281
  else
@@ -304,7 +304,7 @@ module Cucumber
304
304
 
305
305
  i0, s0 = index, []
306
306
  if input.index('@', index) == index
307
- r1 = (SyntaxNode).new(input, index...(index + 1))
307
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
308
308
  @index += 1
309
309
  else
310
310
  terminal_parse_failure('@')
@@ -315,7 +315,7 @@ module Cucumber
315
315
  s2, i2 = [], index
316
316
  loop do
317
317
  if input.index(Regexp.new('[^@\\r\\n\\t ]'), index) == index
318
- r3 = (SyntaxNode).new(input, index...(index + 1))
318
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
319
319
  @index += 1
320
320
  else
321
321
  r3 = nil
@@ -330,12 +330,12 @@ module Cucumber
330
330
  self.index = i2
331
331
  r2 = nil
332
332
  else
333
- r2 = SyntaxNode.new(input, i2...index, s2)
333
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
334
334
  end
335
335
  s0 << r2
336
336
  end
337
337
  if s0.last
338
- r0 = (SyntaxNode).new(input, i0...index, s0)
338
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
339
339
  r0.extend(Tag0)
340
340
  else
341
341
  self.index = i0
@@ -381,7 +381,7 @@ module Cucumber
381
381
  s1 << r3
382
382
  end
383
383
  if s1.last
384
- r1 = (SyntaxNode).new(input, i1...index, s1)
384
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
385
385
  r1.extend(Comment0)
386
386
  else
387
387
  self.index = i1
@@ -393,7 +393,7 @@ module Cucumber
393
393
  break
394
394
  end
395
395
  end
396
- r0 = SyntaxNode.new(input, i0...index, s0)
396
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
397
397
  r0.extend(Comment1)
398
398
 
399
399
  node_cache[:comment][start_index] = r0
@@ -417,7 +417,7 @@ module Cucumber
417
417
 
418
418
  i0, s0 = index, []
419
419
  if input.index('#', index) == index
420
- r1 = (SyntaxNode).new(input, index...(index + 1))
420
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
421
421
  @index += 1
422
422
  else
423
423
  terminal_parse_failure('#')
@@ -429,7 +429,7 @@ module Cucumber
429
429
  s0 << r2
430
430
  end
431
431
  if s0.last
432
- r0 = (SyntaxNode).new(input, i0...index, s0)
432
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
433
433
  r0.extend(CommentLine0)
434
434
  else
435
435
  self.index = i0
@@ -454,8 +454,12 @@ module Cucumber
454
454
  elements[2]
455
455
  end
456
456
 
457
+ def name
458
+ elements[4]
459
+ end
460
+
457
461
  def steps
458
- elements[5]
462
+ elements[6]
459
463
  end
460
464
  end
461
465
 
@@ -464,7 +468,8 @@ module Cucumber
464
468
  Ast::Background.new(
465
469
  comment.build,
466
470
  background_keyword.line,
467
- background_keyword.text_value,
471
+ background_keyword.text_value,
472
+ name.text_value,
468
473
  steps.build
469
474
  )
470
475
  end
@@ -497,47 +502,56 @@ module Cucumber
497
502
  break
498
503
  end
499
504
  end
500
- r4 = SyntaxNode.new(input, i4...index, s4)
505
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
501
506
  s0 << r4
502
507
  if r4
503
- i6 = index
504
- s7, i7 = [], index
505
- loop do
506
- r8 = _nt_eol
507
- if r8
508
- s7 << r8
509
- else
510
- break
511
- end
512
- end
513
- if s7.empty?
514
- self.index = i7
515
- r7 = nil
516
- else
517
- r7 = SyntaxNode.new(input, i7...index, s7)
518
- end
508
+ r7 = _nt_line_to_eol
519
509
  if r7
520
510
  r6 = r7
521
511
  else
522
- r9 = _nt_eof
523
- if r9
524
- r6 = r9
525
- else
526
- self.index = i6
527
- r6 = nil
528
- end
512
+ r6 = instantiate_node(SyntaxNode,input, index...index)
529
513
  end
530
514
  s0 << r6
531
515
  if r6
532
- r10 = _nt_steps
533
- s0 << r10
516
+ i8 = index
517
+ s9, i9 = [], index
518
+ loop do
519
+ r10 = _nt_eol
520
+ if r10
521
+ s9 << r10
522
+ else
523
+ break
524
+ end
525
+ end
526
+ if s9.empty?
527
+ self.index = i9
528
+ r9 = nil
529
+ else
530
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
531
+ end
532
+ if r9
533
+ r8 = r9
534
+ else
535
+ r11 = _nt_eof
536
+ if r11
537
+ r8 = r11
538
+ else
539
+ self.index = i8
540
+ r8 = nil
541
+ end
542
+ end
543
+ s0 << r8
544
+ if r8
545
+ r12 = _nt_steps
546
+ s0 << r12
547
+ end
534
548
  end
535
549
  end
536
550
  end
537
551
  end
538
552
  end
539
553
  if s0.last
540
- r0 = (SyntaxNode).new(input, i0...index, s0)
554
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
541
555
  r0.extend(Background0)
542
556
  r0.extend(Background1)
543
557
  else
@@ -585,7 +599,7 @@ module Cucumber
585
599
  break
586
600
  end
587
601
  end
588
- r0 = SyntaxNode.new(input, i0...index, s0)
602
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
589
603
  r0.extend(FeatureElements0)
590
604
 
591
605
  node_cache[:feature_elements][start_index] = r0
@@ -671,7 +685,7 @@ module Cucumber
671
685
  break
672
686
  end
673
687
  end
674
- r5 = SyntaxNode.new(input, i5...index, s5)
688
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
675
689
  s0 << r5
676
690
  if r5
677
691
  r7 = _nt_line_to_eol
@@ -694,7 +708,7 @@ module Cucumber
694
708
  end
695
709
  end
696
710
  if s0.last
697
- r0 = (SyntaxNode).new(input, i0...index, s0)
711
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
698
712
  r0.extend(Scenario0)
699
713
  r0.extend(Scenario1)
700
714
  else
@@ -790,7 +804,7 @@ module Cucumber
790
804
  break
791
805
  end
792
806
  end
793
- r5 = SyntaxNode.new(input, i5...index, s5)
807
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
794
808
  s0 << r5
795
809
  if r5
796
810
  r7 = _nt_line_to_eol
@@ -817,7 +831,7 @@ module Cucumber
817
831
  end
818
832
  end
819
833
  if s0.last
820
- r0 = (SyntaxNode).new(input, i0...index, s0)
834
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
821
835
  r0.extend(ScenarioOutline0)
822
836
  r0.extend(ScenarioOutline1)
823
837
  else
@@ -853,7 +867,7 @@ module Cucumber
853
867
  break
854
868
  end
855
869
  end
856
- r0 = SyntaxNode.new(input, i0...index, s0)
870
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
857
871
  r0.extend(Steps0)
858
872
 
859
873
  node_cache[:steps][start_index] = r0
@@ -918,7 +932,7 @@ module Cucumber
918
932
  break
919
933
  end
920
934
  end
921
- r2 = SyntaxNode.new(input, i2...index, s2)
935
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
922
936
  s0 << r2
923
937
  if r2
924
938
  r4 = _nt_step_keyword
@@ -944,7 +958,7 @@ module Cucumber
944
958
  self.index = i8
945
959
  r8 = nil
946
960
  else
947
- r8 = SyntaxNode.new(input, i8...index, s8)
961
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
948
962
  end
949
963
  if r8
950
964
  r7 = r8
@@ -963,7 +977,7 @@ module Cucumber
963
977
  if r12
964
978
  r11 = r12
965
979
  else
966
- r11 = SyntaxNode.new(input, index...index)
980
+ r11 = instantiate_node(SyntaxNode,input, index...index)
967
981
  end
968
982
  s0 << r11
969
983
  if r11
@@ -977,7 +991,7 @@ module Cucumber
977
991
  end
978
992
  end
979
993
  if s0.last
980
- r0 = (SyntaxNode).new(input, i0...index, s0)
994
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
981
995
  r0.extend(Step0)
982
996
  r0.extend(Step1)
983
997
  else
@@ -1013,7 +1027,7 @@ module Cucumber
1013
1027
  break
1014
1028
  end
1015
1029
  end
1016
- r0 = SyntaxNode.new(input, i0...index, s0)
1030
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1017
1031
  r0.extend(ExamplesSections0)
1018
1032
 
1019
1033
  node_cache[:examples_sections][start_index] = r0
@@ -1067,7 +1081,7 @@ module Cucumber
1067
1081
  break
1068
1082
  end
1069
1083
  end
1070
- r1 = SyntaxNode.new(input, i1...index, s1)
1084
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1071
1085
  s0 << r1
1072
1086
  if r1
1073
1087
  r3 = _nt_examples_keyword
@@ -1082,14 +1096,14 @@ module Cucumber
1082
1096
  break
1083
1097
  end
1084
1098
  end
1085
- r4 = SyntaxNode.new(input, i4...index, s4)
1099
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1086
1100
  s0 << r4
1087
1101
  if r4
1088
1102
  r7 = _nt_line_to_eol
1089
1103
  if r7
1090
1104
  r6 = r7
1091
1105
  else
1092
- r6 = SyntaxNode.new(input, index...index)
1106
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1093
1107
  end
1094
1108
  s0 << r6
1095
1109
  if r6
@@ -1108,7 +1122,7 @@ module Cucumber
1108
1122
  end
1109
1123
  end
1110
1124
  if s0.last
1111
- r0 = (SyntaxNode).new(input, i0...index, s0)
1125
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1112
1126
  r0.extend(Examples0)
1113
1127
  r0.extend(Examples1)
1114
1128
  else
@@ -1168,12 +1182,12 @@ module Cucumber
1168
1182
  r2 = nil
1169
1183
  else
1170
1184
  self.index = i2
1171
- r2 = SyntaxNode.new(input, index...index)
1185
+ r2 = instantiate_node(SyntaxNode,input, index...index)
1172
1186
  end
1173
1187
  s1 << r2
1174
1188
  if r2
1175
1189
  if index < input_length
1176
- r4 = (SyntaxNode).new(input, index...(index + 1))
1190
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1177
1191
  @index += 1
1178
1192
  else
1179
1193
  terminal_parse_failure("any character")
@@ -1182,7 +1196,7 @@ module Cucumber
1182
1196
  s1 << r4
1183
1197
  end
1184
1198
  if s1.last
1185
- r1 = (SyntaxNode).new(input, i1...index, s1)
1199
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1186
1200
  r1.extend(LineToEol0)
1187
1201
  else
1188
1202
  self.index = i1
@@ -1194,7 +1208,7 @@ module Cucumber
1194
1208
  break
1195
1209
  end
1196
1210
  end
1197
- r0 = SyntaxNode.new(input, i0...index, s0)
1211
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1198
1212
 
1199
1213
  node_cache[:line_to_eol][start_index] = r0
1200
1214
 
@@ -1245,12 +1259,12 @@ module Cucumber
1245
1259
  r4 = nil
1246
1260
  else
1247
1261
  self.index = i4
1248
- r4 = SyntaxNode.new(input, index...index)
1262
+ r4 = instantiate_node(SyntaxNode,input, index...index)
1249
1263
  end
1250
1264
  s3 << r4
1251
1265
  if r4
1252
1266
  if index < input_length
1253
- r6 = (SyntaxNode).new(input, index...(index + 1))
1267
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1254
1268
  @index += 1
1255
1269
  else
1256
1270
  terminal_parse_failure("any character")
@@ -1259,7 +1273,7 @@ module Cucumber
1259
1273
  s3 << r6
1260
1274
  end
1261
1275
  if s3.last
1262
- r3 = (SyntaxNode).new(input, i3...index, s3)
1276
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1263
1277
  r3.extend(PyString0)
1264
1278
  else
1265
1279
  self.index = i3
@@ -1271,7 +1285,7 @@ module Cucumber
1271
1285
  break
1272
1286
  end
1273
1287
  end
1274
- r2 = SyntaxNode.new(input, i2...index, s2)
1288
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1275
1289
  s0 << r2
1276
1290
  if r2
1277
1291
  r7 = _nt_close_py_string
@@ -1279,7 +1293,7 @@ module Cucumber
1279
1293
  end
1280
1294
  end
1281
1295
  if s0.last
1282
- r0 = (SyntaxNode).new(input, i0...index, s0)
1296
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1283
1297
  r0.extend(PyString1)
1284
1298
  r0.extend(PyString2)
1285
1299
  else
@@ -1325,7 +1339,7 @@ module Cucumber
1325
1339
  s0 << r1
1326
1340
  if r1
1327
1341
  if input.index('"""', index) == index
1328
- r2 = (SyntaxNode).new(input, index...(index + 3))
1342
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
1329
1343
  @index += 3
1330
1344
  else
1331
1345
  terminal_parse_failure('"""')
@@ -1342,7 +1356,7 @@ module Cucumber
1342
1356
  break
1343
1357
  end
1344
1358
  end
1345
- r3 = SyntaxNode.new(input, i3...index, s3)
1359
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1346
1360
  s0 << r3
1347
1361
  if r3
1348
1362
  r5 = _nt_eol
@@ -1351,7 +1365,7 @@ module Cucumber
1351
1365
  end
1352
1366
  end
1353
1367
  if s0.last
1354
- r0 = (SyntaxNode).new(input, i0...index, s0)
1368
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1355
1369
  r0.extend(OpenPyString0)
1356
1370
  r0.extend(OpenPyString1)
1357
1371
  else
@@ -1405,11 +1419,11 @@ module Cucumber
1405
1419
  break
1406
1420
  end
1407
1421
  end
1408
- r2 = SyntaxNode.new(input, i2...index, s2)
1422
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1409
1423
  s0 << r2
1410
1424
  if r2
1411
1425
  if input.index('"""', index) == index
1412
- r4 = (SyntaxNode).new(input, index...(index + 3))
1426
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
1413
1427
  @index += 3
1414
1428
  else
1415
1429
  terminal_parse_failure('"""')
@@ -1423,7 +1437,7 @@ module Cucumber
1423
1437
  end
1424
1438
  end
1425
1439
  if s0.last
1426
- r0 = (SyntaxNode).new(input, i0...index, s0)
1440
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1427
1441
  r0.extend(ClosePyString0)
1428
1442
  r0.extend(ClosePyString1)
1429
1443
  else
@@ -1465,7 +1479,7 @@ module Cucumber
1465
1479
  break
1466
1480
  end
1467
1481
  end
1468
- r0 = SyntaxNode.new(input, i0...index, s0)
1482
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1469
1483
 
1470
1484
  node_cache[:white][start_index] = r0
1471
1485
 
@@ -59,12 +59,13 @@ module Cucumber
59
59
  end
60
60
 
61
61
  rule background
62
- comment white background_keyword space* (eol+ / eof) steps {
62
+ comment white background_keyword space* name:line_to_eol? (eol+ / eof) steps {
63
63
  def build
64
64
  Ast::Background.new(
65
65
  comment.build,
66
66
  background_keyword.line,
67
- background_keyword.text_value,
67
+ background_keyword.text_value,
68
+ name.text_value,
68
69
  steps.build
69
70
  )
70
71
  end
@@ -59,7 +59,7 @@ module Cucumber
59
59
  PARAM_PATTERN = /"([^\"]*)"/
60
60
  ESCAPED_PARAM_PATTERN = '"([^\\"]*)"'
61
61
 
62
- def self.snippet_text(step_keyword, step_name)
62
+ def self.snippet_text(step_keyword, step_name, multiline_arg_class = nil)
63
63
  escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
64
64
  escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
65
65
 
@@ -68,9 +68,11 @@ module Cucumber
68
68
  n += 1
69
69
  "arg#{n}"
70
70
  end
71
+ block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
71
72
  block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
73
+ multiline_class_string = multiline_arg_class ? "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n " : ""
72
74
 
73
- "#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n pending\nend"
75
+ "#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_string}pending\nend"
74
76
  end
75
77
 
76
78
  class MissingProc < StandardError
@@ -45,6 +45,12 @@ module Cucumber
45
45
  end
46
46
  end
47
47
 
48
+ class NilWorld < StandardError
49
+ def initialize
50
+ super("World procs should never return nil")
51
+ end
52
+ end
53
+
48
54
  # This is the main interface for registering step definitions, which is done
49
55
  # from <tt>*_steps.rb</tt> files. This module is included right at the top-level
50
56
  # so #register_step_definition (and more interestingly - its aliases) are
@@ -139,8 +145,8 @@ module Cucumber
139
145
  @step_definitions ||= []
140
146
  end
141
147
 
142
- def snippet_text(step_keyword, step_name)
143
- @snippet_generator.snippet_text(step_keyword, step_name)
148
+ def snippet_text(step_keyword, step_name, multiline_arg_class)
149
+ @snippet_generator.snippet_text(step_keyword, step_name, multiline_arg_class)
144
150
  end
145
151
 
146
152
  def before_and_after(scenario, skip=false)
@@ -171,6 +177,15 @@ module Cucumber
171
177
  @current_world = Object.new
172
178
  (@world_procs ||= []).each do |proc|
173
179
  @current_world = proc.call(@current_world)
180
+ if @current_world.nil?
181
+ begin
182
+ raise NilWorld.new
183
+ rescue NilWorld => e
184
+ e.backtrace.clear
185
+ e.backtrace.push(proc.backtrace_line("World"))
186
+ raise e
187
+ end
188
+ end
174
189
  end
175
190
 
176
191
  @current_world.extend(World)
@@ -3,7 +3,7 @@ module Cucumber #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
5
  TINY = 3
6
- PATCH = nil # Set to nil for official release
6
+ PATCH = 1 # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
9
9
  end
@@ -26,6 +26,7 @@ module Cucumber
26
26
  comment=Comment.new(''),
27
27
  line=2,
28
28
  keyword="",
29
+ name="",
29
30
  steps=[
30
31
  Step.new(7, "Given", "y is 5")
31
32
  ])
@@ -30,7 +30,7 @@ module Cucumber
30
30
  Cucumber sandwich
31
31
  }, 10)
32
32
 
33
- background = Ast::Background.new(Ast::Comment.new(""), 2, "Background:",
33
+ background = Ast::Background.new(Ast::Comment.new(""), 2, "Background:", "",
34
34
  [
35
35
  Step.new(3, "Given", "a passing step")
36
36
  ]
@@ -2,36 +2,53 @@ require File.dirname(__FILE__) + '/../../spec_helper'
2
2
  require 'cucumber/core_ext/instance_exec'
3
3
 
4
4
  describe Proc do
5
+ it "should remove extraneous path info for file" do
6
+ proc = lambda {|a,b|}
7
+ proc.file_colon_line.should =~ /^specs\/cucumber\/core_ext\/proc_spec\.rb:6/
8
+ end
9
+
5
10
  it "should raise ArityMismatchError for too many args (expecting 0)" do
6
11
  lambda {
7
12
  Object.new.cucumber_instance_exec(true, 'foo', 1) do
8
13
  end
9
- }.should raise_error(Cucumber::ArityMismatchError, "expected 0 block argument(s), got 1")
14
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
10
15
  end
11
16
 
12
17
  it "should raise ArityMismatchError for too many args (expecting 1)" do
13
18
  lambda {
14
19
  Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
15
20
  end
16
- }.should raise_error(Cucumber::ArityMismatchError, "expected 1 block argument(s), got 2")
21
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
17
22
  end
18
23
 
19
24
  it "should raise ArityMismatchError for too few args (expecting 1)" do
20
25
  lambda {
21
26
  Object.new.cucumber_instance_exec(true, 'foo') do |a|
22
27
  end
23
- }.should raise_error(Cucumber::ArityMismatchError, "expected 1 block argument(s), got 0")
28
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
24
29
  end
25
30
 
26
31
  it "should raise ArityMismatchError for too few args (expecting 2)" do
27
32
  lambda {
28
33
  Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
29
34
  end
30
- }.should raise_error(Cucumber::ArityMismatchError, "expected 2 block argument(s), got 1")
35
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
31
36
  end
32
-
33
- it "should remove extraneous path info for file" do
34
- proc = lambda {|a,b|}
35
- proc.file_colon_line.should == "specs/cucumber/core_ext/proc_spec.rb:34"
37
+
38
+ if Cucumber::RUBY_1_9
39
+ it "should allow varargs" do
40
+ lambda {
41
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
42
+ end
43
+ }.should_not raise_error(Cucumber::ArityMismatchError)
44
+ end
45
+ else
46
+ # Ruby 1.8
47
+ it "should not allow varargs because Ruby 1.8 reports same arity as with no args, so we can't really tell the difference." do
48
+ lambda {
49
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
50
+ end
51
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
52
+ end
36
53
  end
37
54
  end
@@ -85,5 +85,18 @@ 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 => e
97
+ e.message.should == "World procs should never return nil"
98
+ e.backtrace.should == ["specs/cucumber/step_mother_spec.rb:90:in `World'"]
99
+ end
100
+ end
88
101
  end
89
102
  end
data/specs/spec_helper.rb CHANGED
@@ -1,21 +1,12 @@
1
1
  require 'rubygems'
2
2
  gem 'rspec'
3
- require 'spec/expectations'
3
+ require 'spec'
4
+ require 'spec/autorun'
4
5
 
5
6
  ENV['CUCUMBER_COLORS']=nil
6
- $KCODE='u'
7
7
  $:.unshift(File.dirname(__FILE__) + '/../lib')
8
8
  require 'cucumber'
9
9
  Cucumber.load_language('en')
10
10
  $:.unshift(File.dirname(__FILE__))
11
11
 
12
12
  ::Term::ANSIColor.coloring = true
13
-
14
- # Open up the tree classes a little for easier inspection.
15
- module Cucumber
16
- module Tree
17
- class Feature
18
- attr_reader :header, :scenarios
19
- end
20
- end
21
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aslakhellesoy-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Aslak Helles\xC3\xB8y"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-30 00:00:00 -07:00
12
+ date: 2009-04-02 00:00:00 -07:00
13
13
  default_executable: cucumber
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -195,6 +195,11 @@ files:
195
195
  - examples/i18n/se/features/step_definitons/kalkulator_steps.rb
196
196
  - examples/i18n/se/features/summering.feature
197
197
  - examples/i18n/se/lib/kalkulator.rb
198
+ - examples/i18n/sk/Rakefile
199
+ - examples/i18n/sk/features/addition.feature
200
+ - examples/i18n/sk/features/division.feature
201
+ - examples/i18n/sk/features/step_definitons/calculator_steps.rb
202
+ - examples/i18n/sk/lib/calculator.rb
198
203
  - examples/i18n/zh-CN/Rakefile
199
204
  - examples/i18n/zh-CN/features/addition.feature
200
205
  - examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb
@@ -222,6 +227,7 @@ files:
222
227
  - examples/selenium_webrat/features/support/env.rb
223
228
  - examples/self_test/README.textile
224
229
  - examples/self_test/Rakefile
230
+ - examples/self_test/features/background/background_with_name.feature
225
231
  - examples/self_test/features/background/failing_background.feature
226
232
  - examples/self_test/features/background/failing_background_after_success.feature
227
233
  - examples/self_test/features/background/multiline_args_background.feature
@@ -238,6 +244,7 @@ files:
238
244
  - examples/self_test/features/support/env.rb
239
245
  - examples/self_test/features/support/tag_count_formatter.rb
240
246
  - examples/self_test/features/tons_of_cukes.feature
247
+ - examples/self_test/features/undefined_multiline_args.feature
241
248
  - examples/sinatra/Rakefile
242
249
  - examples/sinatra/app.rb
243
250
  - examples/sinatra/features/add.feature
@@ -278,6 +285,7 @@ files:
278
285
  - features/cucumber_cli_outlines.feature
279
286
  - features/custom_formatter.feature
280
287
  - features/report_called_undefined_steps.feature
288
+ - features/snippet.feature
281
289
  - features/step_definitions/cucumber_steps.rb
282
290
  - features/step_definitions/extra_steps.rb
283
291
  - features/support/env.rb