diff --git a/lib/cucumber/formatter/message.rb b/lib/cucumber/formatter/message.rb index 38f3b4f71..a4abcb805 100644 --- a/lib/cucumber/formatter/message.rb +++ b/lib/cucumber/formatter/message.rb @@ -1,20 +1,23 @@ # frozen_string_literal: true require 'cucumber/formatter/io' -require 'cucumber/formatter/message_builder' +require 'cucumber/query' module Cucumber module Formatter # The formatter used for --format message - class Message < MessageBuilder + class Message include Io def initialize(config) @io = ensure_io(config.out_stream, config.error_stream) - super(config) + @repository = Cucumber::Repository.new + @query = Cucumber::Query.new(@repository) + config.on_event :envelope, &method(:output_envelope) end - def output_envelope(envelope) + def output_envelope(event) + envelope = event.envelope @repository.update(envelope) @io.write(envelope.to_json) @io.write("\n") diff --git a/lib/cucumber/formatter/message_builder.rb b/lib/cucumber/formatter/message_builder.rb index 5256a5c71..65babbfcc 100644 --- a/lib/cucumber/formatter/message_builder.rb +++ b/lib/cucumber/formatter/message_builder.rb @@ -3,8 +3,6 @@ require 'base64' require 'cucumber/formatter/backtrace_filter' -require 'cucumber/query' - module Cucumber module Formatter class MessageBuilder @@ -14,7 +12,6 @@ class MessageBuilder def initialize(config) @config = config @repository = Cucumber::Repository.new - @query = Cucumber::Query.new(@repository) @test_run_started_id = config.id_generator.new_id @@ -27,7 +24,6 @@ def initialize(config) @step_match_arguments_by_test_step_id = {} # Ensure all handlers for events occur after all ivars are instantiated - config.on_event :envelope, &method(:on_envelope) config.on_event :gherkin_source_parsed, &method(:on_gherkin_source_parsed) config.on_event :gherkin_source_read, &method(:on_gherkin_source_read) @@ -35,7 +31,6 @@ def initialize(config) config.on_event :hook_test_step_created, &method(:on_hook_test_step_created) config.on_event :step_activated, &method(:on_step_activated) - config.on_event :step_definition_registered, &method(:on_step_definition_registered) config.on_event :test_case_created, &method(:on_test_case_created) config.on_event :test_case_ready, &method(:on_test_case_ready) @@ -84,15 +79,11 @@ def attach(src, media_type, filename) end message = Cucumber::Messages::Envelope.new(attachment: Cucumber::Messages::Attachment.new(**attachment_data)) - output_envelope(message) + @config.event_bus.envelope(message) end private - def on_envelope(event) - output_envelope(event.envelope) - end - def on_gherkin_source_parsed(_event) # TODO: Handle GherkinSourceParsed end @@ -106,7 +97,7 @@ def on_gherkin_source_read(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_hook_test_step_created(event) @@ -118,10 +109,6 @@ def on_step_activated(event) @step_match_arguments_by_test_step_id[event.test_step.id] = event.step_match.step_arguments end - def on_step_definition_registered(event) - output_envelope(event.step_definition.to_envelope) - end - def on_test_case_created(event) @pickle_id_by_test_case_id[event.test_case.id] = event.pickle.id end @@ -139,7 +126,7 @@ def on_test_case_ready(event) # TODO: This may be a redundant update. But for now we're leaving this in whilst we're in the transitory phase @repository.update(message) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_case_started(event) @@ -164,7 +151,8 @@ def on_test_case_started(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) + @repository.update(message) end def on_test_case_finished(event) @@ -187,7 +175,7 @@ def on_test_case_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_started(*) @@ -198,7 +186,7 @@ def on_test_run_started(*) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_finished(event) @@ -210,7 +198,7 @@ def on_test_run_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_hook_started(event) @@ -225,7 +213,7 @@ def on_test_run_hook_started(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_hook_finished(event) @@ -249,7 +237,7 @@ def on_test_run_hook_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_step_created(event) @@ -278,7 +266,7 @@ def on_test_step_started(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_step_finished(event) @@ -316,7 +304,7 @@ def on_test_step_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_undefined_parameter_type(event) @@ -327,7 +315,7 @@ def on_undefined_parameter_type(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def test_step_to_message(step) diff --git a/lib/cucumber/formatter/rerun.rb b/lib/cucumber/formatter/rerun.rb index bbf7b3081..ae6436628 100644 --- a/lib/cucumber/formatter/rerun.rb +++ b/lib/cucumber/formatter/rerun.rb @@ -1,17 +1,23 @@ # frozen_string_literal: true require 'cucumber/formatter/io' -require 'cucumber/formatter/message_builder' +require 'cucumber/query' module Cucumber module Formatter - class Rerun < MessageBuilder + class Rerun + include Io + def initialize(config) + @config = config @io = ensure_io(config.out_stream, config.error_stream) - super(config) + @repository = Cucumber::Repository.new + @query = Cucumber::Query.new(@repository) + config.on_event :envelope, &method(:output_envelope) end - def output_envelope(envelope) + def output_envelope(event) + envelope = event.envelope @repository.update(envelope) finish_report if envelope.test_run_finished end diff --git a/lib/cucumber/glue/registry_and_more.rb b/lib/cucumber/glue/registry_and_more.rb index d70778f05..1ea09bb16 100644 --- a/lib/cucumber/glue/registry_and_more.rb +++ b/lib/cucumber/glue/registry_and_more.rb @@ -99,6 +99,7 @@ def register_rb_step_definition(string_or_regexp, proc_or_sym, options) step_definition = StepDefinition.new(@configuration.id_generator.new_id, self, string_or_regexp, proc_or_sym, options) @step_definitions << step_definition @configuration.notify :step_definition_registered, step_definition + @configuration.notify :envelope, step_definition.to_envelope step_definition rescue Cucumber::CucumberExpressions::UndefinedParameterTypeError => e # TODO: add a way to extract the parameter type directly from the error. diff --git a/lib/cucumber/runtime.rb b/lib/cucumber/runtime.rb index 5b8416ca9..3c760eb6f 100644 --- a/lib/cucumber/runtime.rb +++ b/lib/cucumber/runtime.rb @@ -185,12 +185,16 @@ def set_encoding def report return @report if @report - reports = [summary_report, global_hooks_summary_report] + formatters + reports = [message_builder, summary_report, global_hooks_summary_report] + formatters reports << fail_fast_report if @configuration.fail_fast? reports << publish_banner_printer unless @configuration.publish_quiet? @report ||= Formatter::Fanout.new(reports) end + def message_builder + @message_builder ||= Formatter::MessageBuilder.new(@configuration) + end + def summary_report @summary_report ||= Core::Report::Summary.new(@configuration.event_bus) end diff --git a/spec/cucumber/formatter/rerun_spec.rb b/spec/cucumber/formatter/rerun_spec.rb index ae4385701..6c8cefc60 100644 --- a/spec/cucumber/formatter/rerun_spec.rb +++ b/spec/cucumber/formatter/rerun_spec.rb @@ -36,6 +36,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [gherkin], [StandardStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished @@ -70,6 +71,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [foo, bar], [StandardStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished @@ -88,6 +90,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [gherkin], [StandardStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished @@ -107,6 +110,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [gherkin], [FakeObjects::FlakyStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished @@ -128,6 +132,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [gherkin], [FakeObjects::FlakyStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished @@ -144,6 +149,7 @@ module Formatter end described_class.new(config) + MessageBuilder.new(config) execute [gherkin, gherkin], [StandardStepActions.new, Filters::BroadcastTestRunStartedEvent.new(config), Filters::BroadcastTestCaseReadyEvent.new(config)], config.event_bus config.event_bus.test_run_finished diff --git a/spec/cucumber/formatter/spec_helper.rb b/spec/cucumber/formatter/spec_helper.rb index 85b7ad34b..ba9d14ee1 100644 --- a/spec/cucumber/formatter/spec_helper.rb +++ b/spec/cucumber/formatter/spec_helper.rb @@ -21,7 +21,7 @@ module SpecHelper def run_defined_feature define_steps - actual_runtime.visitor = Fanout.new([@formatter]) + actual_runtime.visitor = Fanout.new([actual_runtime.send(:message_builder), @formatter]) receiver = Test::Runner.new(event_bus) event_bus.gherkin_source_read(gherkin_doc.uri, gherkin_doc.body)