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 86a0e9204..7cc31fa84 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) @@ -74,15 +69,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 @@ -96,7 +87,7 @@ def on_gherkin_source_read(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_hook_test_step_created(event) @@ -108,10 +99,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 @@ -129,7 +116,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) @@ -153,7 +140,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) @@ -176,7 +164,7 @@ def on_test_case_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_started(*) @@ -187,7 +175,7 @@ def on_test_run_started(*) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_finished(event) @@ -199,7 +187,7 @@ def on_test_run_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_hook_started(event) @@ -214,7 +202,7 @@ def on_test_run_hook_started(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_run_hook_finished(event) @@ -238,7 +226,7 @@ def on_test_run_hook_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_step_created(event) @@ -267,7 +255,7 @@ def on_test_step_started(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_test_step_finished(event) @@ -305,7 +293,7 @@ def on_test_step_finished(event) ) ) - output_envelope(message) + @config.event_bus.envelope(message) end def on_undefined_parameter_type(event) @@ -316,7 +304,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 f042c027a..09ef22962 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 3315fd171..9efd5ca43 100644 --- a/lib/cucumber/runtime.rb +++ b/lib/cucumber/runtime.rb @@ -191,12 +191,16 @@ def set_encoding def report return @report if @report - reports = [summary_report] + formatters + reports = [message_builder, 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)