aslakhellesoy-cucumber 0.2.3 → 0.2.3.1

Sign up to get free protection for your applications and to get access to all the features.
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