cucumber 3.0.2 → 4.0.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 (145) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +216 -17
  3. data/CONTRIBUTING.md +4 -21
  4. data/README.md +8 -10
  5. data/bin/cucumber +1 -1
  6. data/lib/autotest/cucumber.rb +1 -0
  7. data/lib/autotest/cucumber_mixin.rb +35 -39
  8. data/lib/autotest/cucumber_rails.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  10. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  11. data/lib/autotest/cucumber_rspec.rb +1 -0
  12. data/lib/autotest/cucumber_rspec2.rb +1 -0
  13. data/lib/autotest/discover.rb +1 -0
  14. data/lib/cucumber.rb +2 -1
  15. data/lib/cucumber/cli/configuration.rb +6 -5
  16. data/lib/cucumber/cli/main.rb +14 -14
  17. data/lib/cucumber/cli/options.rb +113 -116
  18. data/lib/cucumber/cli/profile_loader.rb +50 -29
  19. data/lib/cucumber/cli/rerun_file.rb +1 -0
  20. data/lib/cucumber/configuration.rb +38 -29
  21. data/lib/cucumber/constantize.rb +8 -10
  22. data/lib/cucumber/core_ext/string.rb +1 -0
  23. data/lib/cucumber/deprecate.rb +32 -8
  24. data/lib/cucumber/encoding.rb +2 -1
  25. data/lib/cucumber/errors.rb +6 -7
  26. data/lib/cucumber/events.rb +14 -7
  27. data/lib/cucumber/events/envelope.rb +9 -0
  28. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  29. data/lib/cucumber/events/gherkin_source_read.rb +1 -4
  30. data/lib/cucumber/events/hook_test_step_created.rb +13 -0
  31. data/lib/cucumber/events/step_activated.rb +6 -6
  32. data/lib/cucumber/events/step_definition_registered.rb +4 -8
  33. data/lib/cucumber/events/test_case_created.rb +13 -0
  34. data/lib/cucumber/events/test_case_finished.rb +0 -4
  35. data/lib/cucumber/events/test_case_ready.rb +12 -0
  36. data/lib/cucumber/events/test_case_started.rb +0 -4
  37. data/lib/cucumber/events/test_run_finished.rb +2 -3
  38. data/lib/cucumber/events/test_run_started.rb +2 -4
  39. data/lib/cucumber/events/test_step_created.rb +13 -0
  40. data/lib/cucumber/events/test_step_finished.rb +0 -4
  41. data/lib/cucumber/events/test_step_started.rb +1 -5
  42. data/lib/cucumber/events/undefined_parameter_type.rb +10 -0
  43. data/lib/cucumber/file_specs.rb +7 -6
  44. data/lib/cucumber/filters.rb +2 -0
  45. data/lib/cucumber/filters/activate_steps.rb +6 -4
  46. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  47. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  48. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  49. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  50. data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
  51. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
  52. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  53. data/lib/cucumber/filters/prepare_world.rb +6 -13
  54. data/lib/cucumber/filters/quit.rb +3 -6
  55. data/lib/cucumber/filters/randomizer.rb +6 -7
  56. data/lib/cucumber/filters/retry.rb +2 -2
  57. data/lib/cucumber/filters/tag_limits.rb +2 -2
  58. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  59. data/lib/cucumber/filters/tag_limits/verifier.rb +3 -6
  60. data/lib/cucumber/formatter/ansicolor.rb +33 -37
  61. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  62. data/lib/cucumber/formatter/backtrace_filter.rb +10 -10
  63. data/lib/cucumber/formatter/console.rb +65 -74
  64. data/lib/cucumber/formatter/console_counts.rb +4 -9
  65. data/lib/cucumber/formatter/console_issues.rb +9 -6
  66. data/lib/cucumber/formatter/duration.rb +2 -1
  67. data/lib/cucumber/formatter/duration_extractor.rb +4 -2
  68. data/lib/cucumber/formatter/errors.rb +6 -0
  69. data/lib/cucumber/formatter/fail_fast.rb +9 -6
  70. data/lib/cucumber/formatter/fanout.rb +3 -3
  71. data/lib/cucumber/formatter/html.rb +11 -602
  72. data/lib/cucumber/formatter/http_io.rb +146 -0
  73. data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -3
  74. data/lib/cucumber/formatter/interceptor.rb +11 -18
  75. data/lib/cucumber/formatter/io.rb +18 -11
  76. data/lib/cucumber/formatter/json.rb +102 -109
  77. data/lib/cucumber/formatter/junit.rb +73 -68
  78. data/lib/cucumber/formatter/message.rb +22 -0
  79. data/lib/cucumber/formatter/message_builder.rb +255 -0
  80. data/lib/cucumber/formatter/pretty.rb +360 -153
  81. data/lib/cucumber/formatter/progress.rb +31 -32
  82. data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
  83. data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
  84. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
  85. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
  86. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
  87. data/lib/cucumber/formatter/rerun.rb +23 -4
  88. data/lib/cucumber/formatter/stepdefs.rb +2 -2
  89. data/lib/cucumber/formatter/steps.rb +4 -5
  90. data/lib/cucumber/formatter/summary.rb +17 -9
  91. data/lib/cucumber/formatter/unicode.rb +16 -18
  92. data/lib/cucumber/formatter/usage.rb +30 -26
  93. data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
  94. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
  95. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  96. data/lib/cucumber/gherkin/i18n.rb +1 -0
  97. data/lib/cucumber/gherkin/steps_parser.rb +18 -8
  98. data/lib/cucumber/glue/dsl.rb +2 -1
  99. data/lib/cucumber/glue/hook.rb +35 -11
  100. data/lib/cucumber/glue/invoke_in_world.rb +15 -20
  101. data/lib/cucumber/glue/proto_world.rb +47 -39
  102. data/lib/cucumber/glue/registry_and_more.rb +54 -23
  103. data/lib/cucumber/glue/snippet.rb +24 -27
  104. data/lib/cucumber/glue/step_definition.rb +51 -28
  105. data/lib/cucumber/glue/world_factory.rb +1 -3
  106. data/lib/cucumber/hooks.rb +24 -14
  107. data/lib/cucumber/load_path.rb +1 -0
  108. data/lib/cucumber/multiline_argument.rb +6 -8
  109. data/lib/cucumber/multiline_argument/data_table.rb +106 -73
  110. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +8 -11
  111. data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
  112. data/lib/cucumber/platform.rb +4 -3
  113. data/lib/cucumber/project_initializer.rb +1 -1
  114. data/lib/cucumber/rake/task.rb +21 -18
  115. data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
  116. data/lib/cucumber/rspec/doubles.rb +1 -0
  117. data/lib/cucumber/running_test_case.rb +4 -54
  118. data/lib/cucumber/runtime.rb +57 -61
  119. data/lib/cucumber/runtime/after_hooks.rb +9 -4
  120. data/lib/cucumber/runtime/before_hooks.rb +9 -4
  121. data/lib/cucumber/runtime/for_programming_languages.rb +12 -9
  122. data/lib/cucumber/runtime/step_hooks.rb +5 -2
  123. data/lib/cucumber/runtime/support_code.rb +16 -22
  124. data/lib/cucumber/runtime/user_interface.rb +8 -19
  125. data/lib/cucumber/step_definition_light.rb +6 -4
  126. data/lib/cucumber/step_definitions.rb +3 -2
  127. data/lib/cucumber/step_match.rb +20 -18
  128. data/lib/cucumber/step_match_search.rb +9 -9
  129. data/lib/cucumber/term/ansicolor.rb +39 -39
  130. data/lib/cucumber/unit.rb +1 -0
  131. data/lib/cucumber/version +1 -1
  132. data/lib/simplecov_setup.rb +1 -0
  133. metadata +214 -127
  134. data/lib/cucumber/formatter/cucumber.css +0 -286
  135. data/lib/cucumber/formatter/cucumber.sass +0 -247
  136. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
  137. data/lib/cucumber/formatter/html_builder.rb +0 -120
  138. data/lib/cucumber/formatter/inline-js.js +0 -30
  139. data/lib/cucumber/formatter/jquery-min.js +0 -154
  140. data/lib/cucumber/formatter/json_pretty.rb +0 -10
  141. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1028
  142. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -394
  143. data/lib/cucumber/formatter/legacy_api/results.rb +0 -50
  144. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  145. data/lib/cucumber/step_argument.rb +0 -24
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
- require 'cucumber/core/report/summary'
2
+
3
3
  require 'cucumber/formatter/backtrace_filter'
4
4
  require 'cucumber/formatter/console'
5
5
  require 'cucumber/formatter/console_counts'
6
6
  require 'cucumber/formatter/console_issues'
7
7
  require 'cucumber/formatter/io'
8
8
  require 'cucumber/formatter/duration_extractor'
9
- require 'cucumber/formatter/hook_query_visitor'
9
+ require 'cucumber/formatter/ast_lookup'
10
10
 
11
11
  module Cucumber
12
12
  module Formatter
@@ -14,56 +14,58 @@ module Cucumber
14
14
  class Progress
15
15
  include Console
16
16
  include Io
17
- attr_reader :runtime
18
- attr_reader :config, :summary
17
+ attr_reader :config, :current_feature_uri
18
+ private :config, :current_feature_uri
19
19
 
20
20
  def initialize(config)
21
- @config, @io = config, ensure_io(config.out_stream)
22
- @previous_step_keyword = nil
21
+ @config = config
22
+ @io = ensure_io(config.out_stream)
23
23
  @snippets_input = []
24
+ @undefined_parameter_types = []
24
25
  @total_duration = 0
25
- @summary = Cucumber::Core::Report::Summary.new(config.event_bus)
26
26
  @matches = {}
27
27
  @pending_step_matches = []
28
28
  @failed_results = []
29
- @failed_test_cases = []
30
29
  @passed_test_cases = []
30
+ @current_feature_uri = ''
31
+ @gherkin_documents = {}
32
+ @ast_lookup = AstLookup.new(config)
31
33
  @counts = ConsoleCounts.new(config)
32
- @issues = ConsoleIssues.new(config)
34
+ @issues = ConsoleIssues.new(config, @ast_lookup)
33
35
  config.on_event :step_activated, &method(:on_step_activated)
34
36
  config.on_event :test_case_started, &method(:on_test_case_started)
35
37
  config.on_event :test_step_finished, &method(:on_test_step_finished)
36
38
  config.on_event :test_case_finished, &method(:on_test_case_finished)
37
39
  config.on_event :test_run_finished, &method(:on_test_run_finished)
40
+ config.on_event :undefined_parameter_type, &method(:collect_undefined_parameter_type_names)
38
41
  end
39
42
 
40
43
  def on_step_activated(event)
41
- @matches[event.test_step.source] = event.step_match
44
+ @matches[event.test_step.to_s] = event.step_match
42
45
  end
43
46
 
44
- def on_test_case_started(_event)
47
+ def on_test_case_started(event)
45
48
  unless @profile_information_printed
46
49
  do_print_profile_information(config.profiles) unless config.skip_profile_information? || config.profiles.nil? || config.profiles.empty?
47
50
  @profile_information_printed = true
48
51
  end
49
- @previous_step_keyword = nil
52
+ @current_feature_uri = event.test_case.location.file
50
53
  end
51
54
 
52
55
  def on_test_step_finished(event)
53
56
  test_step = event.test_step
54
57
  result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
55
- progress(result.to_sym) if !HookQueryVisitor.new(test_step).hook? || result.failed?
58
+ progress(result.to_sym) if !test_step.hook? || result.failed?
56
59
 
57
- return if HookQueryVisitor.new(test_step).hook?
58
- collect_snippet_data(test_step, result)
59
- @pending_step_matches << @matches[test_step.source] if result.pending?
60
+ return if test_step.hook?
61
+ collect_snippet_data(test_step, @ast_lookup) if result.undefined?
62
+ @pending_step_matches << @matches[test_step.to_s] if result.pending?
60
63
  @failed_results << result if result.failed?
61
64
  end
62
65
 
63
66
  def on_test_case_finished(event)
64
67
  test_case = event.test_case
65
68
  result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
66
- @failed_test_cases << test_case if result.failed?
67
69
  @passed_test_cases << test_case if result.passed?
68
70
  @total_duration += DurationExtractor.new(result).result_duration
69
71
  end
@@ -76,28 +78,25 @@ module Cucumber
76
78
 
77
79
  private
78
80
 
81
+ def gherkin_document
82
+ @ast_lookup.gherkin_document(current_feature_uri)
83
+ end
84
+
79
85
  def print_summary
80
86
  print_elements(@pending_step_matches, :pending, 'steps')
81
87
  print_elements(@failed_results, :failed, 'steps')
82
88
  print_statistics(@total_duration, @config, @counts, @issues)
83
- snippet_text_proc = lambda { |step_keyword, step_name, multiline_arg|
84
- snippet_text(step_keyword, step_name, multiline_arg)
85
- }
86
- do_print_snippets(snippet_text_proc) if config.snippets? && summary.test_steps.total(:undefined) > 0
87
- return unless config.wip?
88
- messages = @passed_test_cases.map do |test_case|
89
- linebreaks("#{test_case.location.on_line(test_case.location.line)}:in `#{test_case.name}'", ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)
90
- end
91
- do_print_passing_wip(messages)
89
+ print_snippets(config.to_hash)
90
+ print_passing_wip(config, @passed_test_cases, @ast_lookup)
92
91
  end
93
92
 
94
93
  CHARS = {
95
- :passed => '.',
96
- :failed => 'F',
97
- :undefined => 'U',
98
- :pending => 'P',
99
- :skipped => '-'
100
- }
94
+ passed: '.',
95
+ failed: 'F',
96
+ undefined: 'U',
97
+ pending: 'P',
98
+ skipped: '-'
99
+ }.freeze
101
100
 
102
101
  def progress(status)
103
102
  char = CHARS[status]
@@ -0,0 +1,31 @@
1
+ require 'cucumber/formatter/errors'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class HookByTestStep
7
+ def initialize(config)
8
+ @hook_id_by_test_step_id = {}
9
+
10
+ config.on_event :test_step_created, &method(:on_test_step_created)
11
+ config.on_event :hook_test_step_created, &method(:on_hook_test_step_created)
12
+ end
13
+
14
+ def hook_id(test_step)
15
+ return @hook_id_by_test_step_id[test_step.id] if @hook_id_by_test_step_id.key?(test_step.id)
16
+ raise TestStepUnknownError, "No hook found for #{test_step.id} }. Known: #{@hook_id_by_test_step_id.keys}"
17
+ end
18
+
19
+ private
20
+
21
+ def on_test_step_created(event)
22
+ @hook_id_by_test_step_id[event.test_step.id] = nil
23
+ end
24
+
25
+ def on_hook_test_step_created(event)
26
+ @hook_id_by_test_step_id[event.test_step.id] = event.hook.id
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ require 'cucumber/formatter/errors'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class PickleByTest
7
+ def initialize(config)
8
+ @pickle_id_by_test_case_id = {}
9
+ config.on_event :test_case_created, &method(:on_test_case_created)
10
+ end
11
+
12
+ def pickle_id(test_case)
13
+ return @pickle_id_by_test_case_id[test_case.id] if @pickle_id_by_test_case_id.key?(test_case.id)
14
+
15
+ raise TestCaseUnknownError, "No pickle found for #{test_case.id} }. Known: #{@pickle_id_by_test_case_id.keys}"
16
+ end
17
+
18
+ private
19
+
20
+ def on_test_case_created(event)
21
+ @pickle_id_by_test_case_id[event.test_case.id] = event.pickle.id
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'cucumber/formatter/errors'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class PickleStepByTestStep
7
+ def initialize(config)
8
+ @pickle_id_step_by_test_step_id = {}
9
+ config.on_event :test_step_created, &method(:on_test_step_created)
10
+ end
11
+
12
+ def pickle_step_id(test_step)
13
+ return @pickle_id_step_by_test_step_id[test_step.id] if @pickle_id_step_by_test_step_id.key?(test_step.id)
14
+
15
+ raise TestStepUnknownError, "No pickle step found for #{test_step.id} }. Known: #{@pickle_id_step_by_test_step_id.keys}"
16
+ end
17
+
18
+ private
19
+
20
+ def on_test_step_created(event)
21
+ @pickle_id_step_by_test_step_id[event.test_step.id] = event.pickle_step.id
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ require 'cucumber/formatter/errors'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class StepDefinitionsByTestStep
7
+ def initialize(config)
8
+ @step_definition_ids_by_test_step_id = {}
9
+ @step_match_arguments_by_test_step_id = {}
10
+
11
+ config.on_event :test_step_created, &method(:on_test_step_created)
12
+ config.on_event :step_activated, &method(:on_step_activated)
13
+ end
14
+
15
+ def step_definition_ids(test_step)
16
+ return @step_definition_ids_by_test_step_id[test_step.id] if @step_definition_ids_by_test_step_id.key?(test_step.id)
17
+
18
+ raise TestStepUnknownError, "No step definition found for #{test_step.id} }. Known: #{@step_definition_ids_by_test_step_id.keys}"
19
+ end
20
+
21
+ def step_match_arguments(test_step)
22
+ return @step_match_arguments_by_test_step_id[test_step.id] if @step_match_arguments_by_test_step_id.key?(test_step.id)
23
+
24
+ raise TestStepUnknownError, "No step match arguments found for #{test_step.id} }. Known: #{@step_match_arguments_by_test_step_id.keys}"
25
+ end
26
+
27
+ private
28
+
29
+ def on_test_step_created(event)
30
+ @step_definition_ids_by_test_step_id[event.test_step.id] = []
31
+ end
32
+
33
+ def on_step_activated(event)
34
+ @step_definition_ids_by_test_step_id[event.test_step.id] << event.step_match.step_definition.id
35
+ @step_match_arguments_by_test_step_id[event.test_step.id] = event.step_match.step_arguments
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'cucumber/formatter/errors'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class TestCaseStartedByTestCase
7
+ def initialize(config)
8
+ @config = config
9
+ config.on_event :test_case_created, &method(:on_test_case_created)
10
+ config.on_event :test_case_started, &method(:on_test_case_started)
11
+
12
+ @attempts_by_test_case_id = {}
13
+ @test_case_started_id_by_test_case_id = {}
14
+ end
15
+
16
+ def attempt_by_test_case(test_case)
17
+ raise TestCaseUnknownError, "No test case found for #{test_case.id} }. Known: #{@attempts_by_test_case_id.keys}" unless @attempts_by_test_case_id.key?(test_case.id)
18
+ @attempts_by_test_case_id[test_case.id]
19
+ end
20
+
21
+ def test_case_started_id_by_test_case(test_case)
22
+ raise TestCaseUnknownError, "No test case found for #{test_case.id} }. Known: #{@test_case_started_id_by_test_case_id.keys}" unless @test_case_started_id_by_test_case_id.key?(test_case.id)
23
+ @test_case_started_id_by_test_case_id[test_case.id]
24
+ end
25
+
26
+ private
27
+
28
+ def on_test_case_created(event)
29
+ @attempts_by_test_case_id[event.test_case.id] = 0
30
+ @test_case_started_id_by_test_case_id[event.test_case.id] = nil
31
+ end
32
+
33
+ def on_test_case_started(event)
34
+ @attempts_by_test_case_id[event.test_case.id] += 1
35
+ @test_case_started_id_by_test_case_id[event.test_case.id] = @config.id_generator.new_id
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/formatter/io'
3
4
 
4
5
  module Cucumber
@@ -6,17 +7,29 @@ module Cucumber
6
7
  class Rerun
7
8
  include Formatter::Io
8
9
 
9
- def initialize(config)
10
+ def initialize(config) # rubocop:disable Metrics/PerceivedComplexity
10
11
  @io = ensure_io(config.out_stream)
11
12
  @config = config
12
13
  @failures = {}
13
14
  config.on_event :test_case_finished do |event|
14
15
  test_case, result = *event.attributes
15
- next if result.ok?(@config.strict)
16
- @failures[test_case.location.file] ||= []
17
- @failures[test_case.location.file] << test_case.location.line
16
+ if @config.strict.strict?(:flaky)
17
+ next if result.ok?(@config.strict)
18
+ add_to_failures(test_case)
19
+ else
20
+ unless @latest_failed_test_case.nil?
21
+ if @latest_failed_test_case != test_case
22
+ add_to_failures(@latest_failed_test_case)
23
+ @latest_failed_test_case = nil
24
+ elsif result.ok?(@config.strict)
25
+ @latest_failed_test_case = nil
26
+ end
27
+ end
28
+ @latest_failed_test_case = test_case unless result.ok?(@config.strict)
29
+ end
18
30
  end
19
31
  config.on_event :test_run_finished do
32
+ add_to_failures(@latest_failed_test_case) unless @latest_failed_test_case.nil?
20
33
  next if @failures.empty?
21
34
  @io.print file_failures.join("\n")
22
35
  end
@@ -27,6 +40,12 @@ module Cucumber
27
40
  def file_failures
28
41
  @failures.map { |file, lines| [file, lines].join(':') }
29
42
  end
43
+
44
+ def add_to_failures(test_case)
45
+ location = test_case.location
46
+ @failures[location.file] ||= []
47
+ @failures[location.file] << location.lines.max unless @failures[location.file].include?(location.lines.max)
48
+ end
30
49
  end
31
50
  end
32
51
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/formatter/usage'
3
4
 
4
5
  module Cucumber
5
6
  module Formatter
6
7
  class Stepdefs < Usage
7
- def print_steps(stepdef_key)
8
- end
8
+ def print_steps(stepdef_key); end
9
9
 
10
10
  def max_step_length
11
11
  0
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Formatter
4
5
  # The formatter used for <tt>--format steps</tt>
5
6
  class Steps
6
-
7
7
  def initialize(runtime, path_or_io, options)
8
8
  @io = ensure_io(path_or_io)
9
9
  @options = options
@@ -35,15 +35,14 @@ module Cucumber
35
35
  end
36
36
 
37
37
  def collect_steps(runtime)
38
- runtime.step_definitions.inject({}) do |step_definitions, step_definition|
38
+ runtime.step_definitions.each_with_object({}) do |step_definition, step_definitions|
39
39
  step_definitions[step_definition.file] ||= []
40
- step_definitions[step_definition.file] << [ step_definition.file_colon_line, step_definition.regexp_source ]
41
- step_definitions
40
+ step_definitions[step_definition.file] << [step_definition.file_colon_line, step_definition.regexp_source]
42
41
  end
43
42
  end
44
43
 
45
44
  def source_indent(sources)
46
- sources.map { |file_colon_line, regexp| regexp.size }.max + 1
45
+ sources.map { |_file_colon_line, regexp| regexp.size }.max + 1
47
46
  end
48
47
  end
49
48
  end
@@ -1,22 +1,25 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/formatter/io'
3
4
  require 'cucumber/formatter/console'
4
5
  require 'cucumber/formatter/console_counts'
5
6
  require 'cucumber/formatter/console_issues'
6
7
  require 'cucumber/core/test/result'
8
+ require 'cucumber/formatter/ast_lookup'
7
9
 
8
10
  module Cucumber
9
11
  module Formatter
10
-
11
12
  # Summary formatter, outputting only feature / scenario titles
12
13
  class Summary
13
14
  include Io
14
15
  include Console
15
16
 
16
17
  def initialize(config)
17
- @config, @io = config, ensure_io(config.out_stream)
18
+ @config = config
19
+ @io = ensure_io(config.out_stream)
20
+ @ast_lookup = AstLookup.new(config)
18
21
  @counts = ConsoleCounts.new(@config)
19
- @issues = ConsoleIssues.new(@config)
22
+ @issues = ConsoleIssues.new(@config, @ast_lookup)
20
23
  @start_time = Time.now
21
24
 
22
25
  @config.on_event :test_case_started do |event|
@@ -28,7 +31,7 @@ module Cucumber
28
31
  print_result event.result
29
32
  end
30
33
 
31
- @config.on_event :test_run_finished do |event|
34
+ @config.on_event :test_run_finished do |_event|
32
35
  duration = Time.now - @start_time
33
36
  @io.puts
34
37
  print_statistics(duration, @config, @counts, @issues)
@@ -37,12 +40,17 @@ module Cucumber
37
40
 
38
41
  private
39
42
 
43
+ def gherkin_document(uri)
44
+ @ast_lookup.gherkin_document(uri)
45
+ end
46
+
40
47
  def print_feature(test_case)
41
- feature = test_case.feature
42
- return if @current_feature == feature
43
- @io.puts unless @current_feature.nil?
44
- @io.puts feature
45
- @current_feature = feature
48
+ uri = test_case.location.file
49
+ return if @current_feature_uri == uri
50
+ feature_name = gherkin_document(uri).feature.name
51
+ @io.puts unless @current_feature_uri.nil?
52
+ @io.puts feature_name
53
+ @current_feature_uri = uri
46
54
  end
47
55
 
48
56
  def print_test_case(test_case)