cucumber 1.2.5 → 1.3.0

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