cucumber 1.2.5 → 1.3.0

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 (110) hide show
  1. checksums.yaml +14 -6
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +1 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +2 -2
  7. data/History.md +38 -2
  8. data/bin/cucumber +2 -11
  9. data/cucumber.gemspec +3 -3
  10. data/cucumber.yml +5 -1
  11. data/examples/test_unit/Gemfile +4 -0
  12. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
  13. data/examples/watir/README.textile +2 -2
  14. data/examples/watir/features/support/env.rb +10 -7
  15. data/features/.cucumber/stepdefs.json +747 -1354
  16. data/features/assertions.feature +6 -2
  17. data/features/background.feature +3 -0
  18. data/features/backtraces.feature +3 -3
  19. data/features/before_hook.feature +43 -0
  20. data/features/bootstrap.feature +14 -2
  21. data/features/custom_formatter.feature +1 -1
  22. data/features/drb_server_integration.feature +3 -3
  23. data/features/formatter_callbacks.feature +2 -2
  24. data/features/formatter_step_file_colon_line.feature +1 -1
  25. data/features/html_formatter.feature +52 -1
  26. data/features/json_formatter.feature +93 -7
  27. data/features/load_path.feature +14 -0
  28. data/features/nested_steps.feature +75 -3
  29. data/features/nested_steps_i18n.feature +36 -0
  30. data/features/pretty_formatter.feature +31 -0
  31. data/features/progress_formatter.feature +31 -0
  32. data/features/raketask.feature +51 -0
  33. data/features/rerun_formatter.feature +1 -1
  34. data/features/stats_formatters.feature +17 -14
  35. data/features/step_definitions/cucumber_steps.rb +6 -4
  36. data/features/support/env.rb +31 -4
  37. data/features/support/feature_factory.rb +17 -0
  38. data/features/tagged_hooks.feature +37 -195
  39. data/features/transforms.feature +15 -15
  40. data/gem_tasks/cucumber.rake +2 -0
  41. data/gem_tasks/yard.rake +10 -6
  42. data/legacy_features/README.md +14 -0
  43. data/legacy_features/language_help.feature +3 -1
  44. data/legacy_features/report_called_undefined_steps.feature +1 -0
  45. data/legacy_features/snippets_when_using_star_keyword.feature +1 -0
  46. data/legacy_features/support/env.rb +4 -0
  47. data/lib/cucumber/ast/background.rb +35 -35
  48. data/lib/cucumber/ast/empty_background.rb +33 -0
  49. data/lib/cucumber/ast/examples.rb +5 -2
  50. data/lib/cucumber/ast/feature.rb +24 -35
  51. data/lib/cucumber/ast/features.rb +4 -1
  52. data/lib/cucumber/ast/has_steps.rb +9 -17
  53. data/lib/cucumber/ast/location.rb +41 -0
  54. data/lib/cucumber/ast/scenario.rb +37 -50
  55. data/lib/cucumber/ast/scenario_outline.rb +62 -49
  56. data/lib/cucumber/ast/step.rb +23 -27
  57. data/lib/cucumber/ast/step_collection.rb +16 -0
  58. data/lib/cucumber/ast/step_invocation.rb +4 -1
  59. data/lib/cucumber/ast/tree_walker.rb +7 -0
  60. data/lib/cucumber/cli/configuration.rb +15 -3
  61. data/lib/cucumber/cli/main.rb +24 -11
  62. data/lib/cucumber/cli/options.rb +24 -16
  63. data/lib/cucumber/configuration.rb +4 -0
  64. data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +10 -34
  65. data/lib/cucumber/core_ext/instance_exec.rb +4 -1
  66. data/lib/cucumber/core_ext/proc.rb +2 -0
  67. data/lib/cucumber/feature_file.rb +5 -12
  68. data/lib/cucumber/formatter/console.rb +10 -0
  69. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +4 -4
  70. data/lib/cucumber/formatter/html.rb +7 -42
  71. data/lib/cucumber/formatter/interceptor.rb +4 -0
  72. data/lib/cucumber/formatter/json_pretty.rb +0 -4
  73. data/lib/cucumber/formatter/junit.rb +8 -2
  74. data/lib/cucumber/formatter/pretty.rb +5 -1
  75. data/lib/cucumber/formatter/progress.rb +4 -0
  76. data/lib/cucumber/formatter/unicode.rb +12 -25
  77. data/lib/cucumber/formatter/usage.rb +7 -2
  78. data/lib/cucumber/js_support/js_snippets.rb +1 -1
  79. data/lib/cucumber/load_path.rb +13 -0
  80. data/lib/cucumber/parser/gherkin_builder.rb +237 -81
  81. data/lib/cucumber/platform.rb +1 -1
  82. data/lib/cucumber/py_support/py_language.rb +1 -1
  83. data/lib/cucumber/rake/task.rb +5 -1
  84. data/lib/cucumber/rb_support/rb_language.rb +20 -19
  85. data/lib/cucumber/rb_support/rb_world.rb +63 -21
  86. data/lib/cucumber/rb_support/snippet.rb +108 -0
  87. data/lib/cucumber/runtime.rb +1 -0
  88. data/lib/cucumber/runtime/support_code.rb +2 -2
  89. data/lib/cucumber/unit.rb +11 -0
  90. data/lib/cucumber/wire_support/wire_language.rb +1 -1
  91. data/spec/cucumber/ast/background_spec.rb +13 -6
  92. data/spec/cucumber/ast/feature_factory.rb +20 -10
  93. data/spec/cucumber/ast/features_spec.rb +51 -0
  94. data/spec/cucumber/ast/scenario_outline_spec.rb +13 -7
  95. data/spec/cucumber/ast/step_spec.rb +6 -4
  96. data/spec/cucumber/cli/configuration_spec.rb +34 -1
  97. data/spec/cucumber/cli/main_spec.rb +36 -26
  98. data/spec/cucumber/cli/options_spec.rb +28 -19
  99. data/spec/cucumber/core_ext/proc_spec.rb +13 -1
  100. data/spec/cucumber/formatter/interceptor_spec.rb +8 -0
  101. data/spec/cucumber/formatter/junit_spec.rb +33 -0
  102. data/spec/cucumber/formatter/pretty_spec.rb +391 -0
  103. data/spec/cucumber/rb_support/rb_language_spec.rb +21 -50
  104. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +2 -4
  105. data/spec/cucumber/rb_support/snippet_spec.rb +128 -0
  106. data/spec/cucumber/step_match_spec.rb +2 -6
  107. metadata +62 -113
  108. data/.rvmrc +0 -1
  109. data/features/hooks.feature +0 -59
  110. data/legacy_features/call_steps_from_stepdefs.feature +0 -154
@@ -4,7 +4,7 @@ require 'rbconfig'
4
4
 
5
5
  module Cucumber
6
6
  unless defined?(Cucumber::VERSION)
7
- VERSION = '1.2.5'
7
+ VERSION = '1.3.0'
8
8
  BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
9
9
  LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
10
10
  JRUBY = defined?(JRUBY_VERSION)
@@ -24,7 +24,7 @@ module Cucumber
24
24
  def alias_adverbs(adverbs)
25
25
  end
26
26
 
27
- def snippet_text(code_keyword, step_name, multiline_arg_class)
27
+ def snippet_text(code_keyword, step_name, multiline_arg_class, snippet_type)
28
28
  "python snippet: #{code_keyword}, #{step_name}"
29
29
  end
30
30
 
@@ -101,7 +101,11 @@ module Cucumber
101
101
  end
102
102
 
103
103
  def run
104
- sh(cmd.join(" "))
104
+ sh cmd.join(" ") do |ok, res|
105
+ if !ok
106
+ exit res.exitstatus
107
+ end
108
+ end
105
109
  end
106
110
  end
107
111
 
@@ -4,6 +4,7 @@ require 'cucumber/rb_support/rb_world'
4
4
  require 'cucumber/rb_support/rb_step_definition'
5
5
  require 'cucumber/rb_support/rb_hook'
6
6
  require 'cucumber/rb_support/rb_transform'
7
+ require 'cucumber/rb_support/snippet'
7
8
 
8
9
  begin
9
10
  require 'rspec/expectations'
@@ -83,25 +84,9 @@ module Cucumber
83
84
  end.compact
84
85
  end
85
86
 
86
- ARGUMENT_PATTERNS = ['"(.*?)"', '(\d+)']
87
-
88
- def snippet_text(code_keyword, step_name, multiline_arg_class)
89
- snippet_pattern = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
90
- arg_count = 0
91
- ARGUMENT_PATTERNS.each do |pattern|
92
- snippet_pattern = snippet_pattern.gsub(Regexp.new(pattern), pattern)
93
- arg_count += snippet_pattern.scan(pattern).length
94
- end
95
-
96
- block_args = (0...arg_count).map {|n| "arg#{n+1}"}
97
- block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
98
- block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
99
- multiline_class_comment = ""
100
- if(multiline_arg_class == Ast::Table)
101
- multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
102
- end
103
-
104
- "#{code_keyword}(/^#{snippet_pattern}$/) do#{block_arg_string}\n #{multiline_class_comment}pending # express the regexp above with the code you wish you had\nend"
87
+ def snippet_text(code_keyword, step_name, multiline_arg_class, snippet_type = :regexp)
88
+ snippet_class = typed_snippet_class(snippet_type)
89
+ snippet_class.new(code_keyword, step_name, multiline_arg_class).to_s
105
90
  end
106
91
 
107
92
  def begin_rb_scenario(scenario)
@@ -184,6 +169,22 @@ module Cucumber
184
169
  o
185
170
  end
186
171
  end
172
+
173
+ SNIPPET_TYPES = {
174
+ :regexp => Snippet::Regexp,
175
+ :classic => Snippet::Classic,
176
+ :percent => Snippet::Percent
177
+ }
178
+
179
+ def typed_snippet_class(type)
180
+ SNIPPET_TYPES.fetch(type || :regexp)
181
+ end
182
+
183
+ def self.cli_snippet_type_options
184
+ SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
185
+ SNIPPET_TYPES[type].cli_option_string(type)
186
+ end
187
+ end
187
188
  end
188
189
  end
189
190
  end
@@ -2,11 +2,17 @@ require 'gherkin/formatter/ansi_escapes'
2
2
 
3
3
  module Cucumber
4
4
  module RbSupport
5
- # All steps are run in the context of an object that extends this module.
5
+ # Defines the basic DSL methods availlable in all Cucumber step definitions.
6
+ #
7
+ # You can, and probably should, extend this DSL with your own methods that
8
+ # make sense in your domain. For more on that, see {Cucumber::RbSupport::RbDsl#World}
6
9
  module RbWorld
10
+
11
+ # @private
7
12
  AnsiEscapes = Gherkin::Formatter::AnsiEscapes
8
13
 
9
14
  class << self
15
+ # @private
10
16
  def alias_adverb(adverb)
11
17
  alias_method adverb, :__cucumber_invoke
12
18
  end
@@ -18,49 +24,95 @@ module Cucumber
18
24
  rb.execute_transforms([arg]).first
19
25
  end
20
26
 
27
+ # @private
21
28
  attr_writer :__cucumber_runtime, :__natural_language
22
29
 
30
+ # @private
23
31
  def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
24
32
  STDERR.puts AnsiEscapes.failed + "WARNING: Using 'Given/When/Then' in step definitions is deprecated, use 'step' to call other steps instead:" + caller[0] + AnsiEscapes.reset
25
33
  @__cucumber_runtime.invoke(name, multiline_argument)
26
34
  end
27
35
 
28
- # Invoke a single step.
36
+ # Run a single Gherkin step
37
+ # @example Call another step
38
+ # step "I am logged in"
39
+ # @example Call a step with quotes in the name
40
+ # step %{the user "Dave" is logged in}
41
+ # @example Passing a table
42
+ # step "the following users exist:", table(%{
43
+ # | name | email |
44
+ # | Matt | matt@matt.com |
45
+ # | Aslak | aslak@aslak.com |
46
+ # })
47
+ # @example Passing a multiline string
48
+ # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
49
+ # @param [String] name The name of the step
50
+ # @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
29
51
  def step(name, multiline_argument=nil)
30
52
  @__cucumber_runtime.invoke(name, multiline_argument)
31
53
  end
32
54
 
33
- # See StepMother#invoke_steps
55
+ # Run a snippet of Gherkin
56
+ # @example
57
+ # steps %{
58
+ # Given the user "Susan" exists
59
+ # And I am logged in as "Susan"
60
+ # }
61
+ # @param [String] steps_text The Gherkin snippet to run
34
62
  def steps(steps_text)
35
63
  @__cucumber_runtime.invoke_steps(steps_text, @__natural_language, caller[0])
36
64
  end
37
65
 
38
- # See StepMother#table
66
+ # Parse Gherkin into a {Cucumber::Ast::Table} object.
67
+ #
68
+ # Useful in conjunction with the #step method.
69
+ # @example Create a table
70
+ # users = table(%{
71
+ # | name | email |
72
+ # | Matt | matt@matt.com |
73
+ # | Aslak | aslak@aslak.com |
74
+ # })
75
+ # @param [String] text_or_table The Gherkin string that represents the table
39
76
  def table(text_or_table, file=nil, line_offset=0)
40
77
  @__cucumber_runtime.table(text_or_table, file, line_offset)
41
78
  end
42
79
 
43
- # See StepMother#doc_string
80
+ # Create an {Cucumber::Ast::DocString} object
81
+ #
82
+ # Useful in conjunction with the #step method, when
83
+ # want to specify a content type.
84
+ # @example Create a multiline string
85
+ # code = multiline_string(%{
86
+ # puts "this is ruby code"
87
+ # %}, 'ruby')
44
88
  def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
89
+ # TODO: rename this method to multiline_string
45
90
  @__cucumber_runtime.doc_string(string_without_triple_quotes, content_type, line_offset)
46
91
  end
47
92
 
93
+ # @deprecated Use {#puts} instead.
48
94
  def announce(*messages)
49
95
  STDERR.puts AnsiEscapes.failed + "WARNING: #announce is deprecated. Use #puts instead:" + caller[0] + AnsiEscapes.reset
50
96
  puts(*messages)
51
97
  end
52
98
 
53
- # See StepMother#puts
99
+ # Print a message to the output.
100
+ #
101
+ # @note Cucumber might surprise you with the behaviour of this method. Instead
102
+ # of sending the output directly to STDOUT, Cucumber will intercept and cache
103
+ # the message until the current step has finished, and then display it.
104
+ #
105
+ # If you'd prefer to see the message immediately, call {Kernel#puts} instead.
54
106
  def puts(*messages)
55
107
  @__cucumber_runtime.puts(*messages)
56
108
  end
57
109
 
58
- # See StepMother#ask
110
+ # Pause the tests and ask the operator for input
59
111
  def ask(question, timeout_seconds=60)
60
112
  @__cucumber_runtime.ask(question, timeout_seconds)
61
113
  end
62
114
 
63
- # See StepMother#embed
115
+ # Embed an image in the output
64
116
  def embed(file, mime_type, label='Screenshot')
65
117
  @__cucumber_runtime.embed(file, mime_type, label)
66
118
  end
@@ -79,19 +131,8 @@ module Cucumber
79
131
  end
80
132
  end
81
133
 
82
- # The default implementation of Object#inspect recursively
83
- # traverses all instance variables and invokes inspect.
84
- # This can be time consuming if the object graph is large.
85
- #
86
- # This can cause unnecessary delays when certain exceptions
87
- # occur. For example, MRI internally invokes #inspect on an
88
- # object that raises a NoMethodError. (JRuby does not do this).
89
- #
90
- # A World object can have many references created by the user
91
- # or frameworks (Rails), so to avoid long waiting times on
92
- # such errors in World we define it to just return a simple String.
93
- #
94
- def inspect #:nodoc:
134
+ # Prints the list of modules that are included in the World
135
+ def inspect
95
136
  modules = [self.class]
96
137
  (class << self; self; end).instance_eval do
97
138
  modules += included_modules
@@ -99,6 +140,7 @@ module Cucumber
99
140
  sprintf("#<%s:0x%x>", modules.join('+'), self.object_id)
100
141
  end
101
142
 
143
+ # see {#inspect}
102
144
  def to_s
103
145
  inspect
104
146
  end
@@ -0,0 +1,108 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ module Snippet
4
+
5
+ ARGUMENT_PATTERNS = ['"(.*?)"', '(\d+)']
6
+
7
+ class BaseSnippet
8
+
9
+ def initialize(code_keyword, pattern, multiline_argument_class)
10
+ @number_of_arguments = 0
11
+ @code_keyword = code_keyword
12
+ @pattern = replace_and_count_capturing_groups(pattern)
13
+ @multiline_argument_class = multiline_argument_class
14
+ end
15
+
16
+ def to_s
17
+ "#{step} #{do_block}"
18
+ end
19
+
20
+ def step
21
+ "#{code_keyword}#{typed_pattern}"
22
+ end
23
+
24
+ def self.cli_option_string(type)
25
+ "%-7s: %-28s e.g. %s" % [type, description, example]
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :code_keyword, :pattern, :multiline_argument_class, :number_of_arguments
31
+
32
+ def replace_and_count_capturing_groups(pattern)
33
+ modified_pattern = ::Regexp.escape(pattern).gsub('\ ', ' ').gsub('/', '\/')
34
+
35
+ ARGUMENT_PATTERNS.each do |argument_pattern|
36
+ modified_pattern.gsub!(::Regexp.new(argument_pattern), argument_pattern)
37
+ @number_of_arguments += modified_pattern.scan(argument_pattern).length
38
+ end
39
+
40
+ modified_pattern
41
+ end
42
+
43
+ def do_block
44
+ do_block = ""
45
+ do_block << "do#{arguments}\n"
46
+ do_block << multiline_comment if multiline_argument_class?
47
+ do_block << " pending # express the regexp above with the code you wish you had\n"
48
+ do_block << "end"
49
+ do_block
50
+ end
51
+
52
+ def arguments
53
+ block_args = (0...number_of_arguments).map { |n| "arg#{n+1}" }
54
+
55
+ if multiline_argument_class
56
+ block_args << multiline_argument_class.default_arg_name
57
+ end
58
+
59
+ block_args.empty? ? "" : " |#{block_args.join(", ")}|"
60
+ end
61
+
62
+ def multiline_comment
63
+ " # #{multiline_argument_class.default_arg_name} is a #{multiline_argument_class.to_s}\n"
64
+ end
65
+
66
+ def multiline_argument_class?
67
+ multiline_argument_class == Ast::Table
68
+ end
69
+
70
+ def self.example
71
+ new("Given", "missing step", nil).step
72
+ end
73
+
74
+ end
75
+
76
+ class Regexp < BaseSnippet
77
+ def typed_pattern
78
+ "(/^#{pattern}$/)"
79
+ end
80
+
81
+ def self.description
82
+ "Snippets with parentheses"
83
+ end
84
+ end
85
+
86
+ class Classic < BaseSnippet
87
+ def typed_pattern
88
+ " /^#{pattern}$/"
89
+ end
90
+
91
+ def self.description
92
+ "Snippets without parentheses. Note that these cause a warning from modern versions of Ruby."
93
+ end
94
+ end
95
+
96
+ class Percent < BaseSnippet
97
+ def typed_pattern
98
+ " %r{^#{pattern}$}"
99
+ end
100
+
101
+ def self.description
102
+ "Snippets with percent regexp"
103
+ end
104
+ end
105
+
106
+ end
107
+ end
108
+ end
@@ -3,6 +3,7 @@ require 'multi_json'
3
3
  require 'gherkin/rubify'
4
4
  require 'gherkin/i18n'
5
5
  require 'cucumber/configuration'
6
+ require 'cucumber/load_path'
6
7
  require 'cucumber/language_support/language_methods'
7
8
  require 'cucumber/formatter/duration'
8
9
  require 'cucumber/runtime/user_interface'
@@ -49,7 +49,7 @@ module Cucumber
49
49
  # })
50
50
  def invoke_steps(steps_text, i18n, file_colon_line)
51
51
  file, line = file_colon_line.split(':')
52
- parser = Gherkin::Parser::Parser.new(StepInvoker.new(self), true, 'steps')
52
+ parser = Gherkin::Parser::Parser.new(StepInvoker.new(self), true, 'steps', false, i18n.iso_code)
53
53
  parser.parse(steps_text, file, line.to_i)
54
54
  end
55
55
 
@@ -99,7 +99,7 @@ module Cucumber
99
99
  def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
100
100
  load_programming_language('rb') if unknown_programming_language?
101
101
  @programming_languages.map do |programming_language|
102
- programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
102
+ programming_language.snippet_text(step_keyword, step_name, multiline_arg_class, @configuration.snippet_type)
103
103
  end.join("\n")
104
104
  end
105
105
 
@@ -0,0 +1,11 @@
1
+ module Cucumber
2
+ class Unit
3
+ def initialize(step_collection)
4
+ @step_collection = step_collection
5
+ end
6
+
7
+ def step_count
8
+ @step_collection.length
9
+ end
10
+ end
11
+ end
@@ -26,7 +26,7 @@ module Cucumber
26
26
  @connections << Connection.new(config)
27
27
  end
28
28
 
29
- def snippet_text(code_keyword, step_name, multiline_arg_class)
29
+ def snippet_text(code_keyword, step_name, multiline_arg_class, snippet_type)
30
30
  snippets = @connections.map do |remote|
31
31
  remote.snippet_text(code_keyword, step_name, multiline_arg_class.to_s)
32
32
  end
@@ -5,6 +5,7 @@ require 'cucumber/rb_support/rb_language'
5
5
  module Cucumber
6
6
  module Ast
7
7
  describe Background do
8
+ let(:language) { stub.as_null_object }
8
9
 
9
10
  before do
10
11
  extend(Cucumber::RbSupport::RbDsl)
@@ -21,24 +22,27 @@ module Cucumber
21
22
 
22
23
  @visitor = TreeWalker.new(@runtime)
23
24
 
24
- @feature = mock('feature', :visit? => true).as_null_object
25
+ @feature = mock('feature', :visit? => true, :feature_elements => []).as_null_object
25
26
  end
26
27
 
27
28
  it "should execute Before blocks before background steps" do
28
29
  background = Background.new(
30
+ language,
31
+ Location.new('foo.feature', 2),
29
32
  comment=Comment.new(''),
30
- line=2,
31
33
  keyword="",
32
34
  title="",
33
35
  description="",
34
36
  steps=[
35
- Step.new(7, "Given", "y is 5")
37
+ Step.new(language,Location.new('foo.feature', 7), "Given", "y is 5")
36
38
  ])
37
39
 
38
40
  scenario = Scenario.new(
41
+ language,
39
42
  background,
40
43
  comment=Comment.new(""),
41
44
  tags=Tags.new(98,[]),
45
+ feature_tags=Tags.new(1,[]),
42
46
  line=99,
43
47
  keyword="",
44
48
  title="",
@@ -54,8 +58,9 @@ module Cucumber
54
58
  describe "should respond to #name" do
55
59
  it "with a value" do
56
60
  background = Background.new(
61
+ language,
62
+ Location.new('foo.feature', 2),
57
63
  comment=Comment.new(''),
58
- line=2,
59
64
  keyword="",
60
65
  title="background name",
61
66
  description="",
@@ -65,6 +70,7 @@ module Cucumber
65
70
  end
66
71
  it "without a value" do
67
72
  background = Background.new(
73
+ language,
68
74
  comment=Comment.new(''),
69
75
  line=2,
70
76
  keyword="",
@@ -86,13 +92,14 @@ module Cucumber
86
92
  it "should state that the background has failed" do
87
93
  # Assign
88
94
  background = Background.new(
95
+ language,
96
+ Location.new('foo.feature', 2),
89
97
  comment=Comment.new(''),
90
- line=2,
91
98
  keyword="",
92
99
  title="",
93
100
  description="",
94
101
  steps=[
95
- Step.new(7, "Given", "y is 5")
102
+ Step.new(language, Location.new('foo.feature', 7), "Given", "y is 5")
96
103
  ])
97
104
  background.feature = @feature
98
105