class Cucumber::Runtime

def accept_options?(factory)

def accept_options?(factory)
  factory.instance_method(:initialize).arity > 1
end

def begin_scenario(test_case)

def begin_scenario(test_case)
  @support_code.fire_hook(:begin_scenario, test_case)
end

def configure(new_configuration)

Allows you to take an existing runtime and change its configuration
def configure(new_configuration)
  @configuration = Configuration.new(new_configuration)
  @support_code.configure(@configuration)
end

def create_formatter(factory, formatter_options, path_or_io)

def create_formatter(factory, formatter_options, path_or_io)
  if accept_options?(factory)
    return factory.new(@configuration, formatter_options) if path_or_io.nil?
    factory.new(@configuration.with_options(out_stream: path_or_io),
                formatter_options)
  else
    return factory.new(@configuration) if path_or_io.nil?
    factory.new(@configuration.with_options(out_stream: path_or_io))
  end
end

def doc_string(string_without_triple_quotes, content_type = '', _line_offset = 0)


Returns Ast::DocString for +string_without_triple_quotes+.
def doc_string(string_without_triple_quotes, content_type = '', _line_offset = 0)
  Core::Test::DocString.new(string_without_triple_quotes, content_type)
end

def dry_run?

def dry_run?
  @configuration.dry_run?
end

def end_scenario(_scenario)

def end_scenario(_scenario)
  @support_code.fire_hook(:end_scenario)
end

def fail_fast_report

def fail_fast_report
  @fail_fast_report ||= Formatter::FailFast.new(@configuration)
end

def failure?

def failure?
  if @configuration.wip?
    summary_report.test_cases.total_passed.positive?
  else
    !summary_report.ok?(strict: @configuration.strict)
  end
end

def feature_files

def feature_files
  filespecs.files
end

def features

def features
  @features ||= feature_files.map do |path|
    source = NormalisedEncodingFile.read(path)
    @configuration.notify :gherkin_source_read, path, source
    Cucumber::Core::Gherkin::Document.new(path, source)
  end
end

def features_paths

def features_paths
  @configuration.paths
end

def filespecs

def filespecs
  @filespecs ||= FileSpecs.new(@configuration.feature_files)
end

def filters

def filters
  tag_expressions = @configuration.tag_expressions
  name_regexps = @configuration.name_regexps
  tag_limits = @configuration.tag_limits
  [].tap do |filters|
    filters << Filters::TagLimits.new(tag_limits) if tag_limits.any?
    filters << Cucumber::Core::Test::TagFilter.new(tag_expressions)
    filters << Cucumber::Core::Test::NameFilter.new(name_regexps)
    filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
    filters << Filters::Randomizer.new(@configuration.seed) if @configuration.randomize?
    # TODO: can we just use Glue::RegistryAndMore's step definitions directly?
    step_match_search = StepMatchSearch.new(@support_code.registry.method(:step_matches), @configuration)
    filters << Filters::ActivateSteps.new(step_match_search, @configuration)
    @configuration.filters.each { |filter| filters << filter }
    unless configuration.dry_run?
      filters << Filters::ApplyAfterStepHooks.new(@support_code)
      filters << Filters::ApplyBeforeHooks.new(@support_code)
      filters << Filters::ApplyAfterHooks.new(@support_code)
      filters << Filters::ApplyAroundHooks.new(@support_code)
    end
    filters << Filters::BroadcastTestCaseReadyEvent.new(@configuration)
    unless configuration.dry_run?
      filters << Filters::BroadcastTestRunStartedEvent.new(@configuration)
      filters << Filters::Quit.new
      filters << Filters::Retry.new(@configuration)
      # need to do this last so it becomes the first test step
      filters << Filters::PrepareWorld.new(self)
    end
  end
end

def fire_after_all_hook # :nodoc:

:nodoc:
def fire_after_all_hook # :nodoc:
  @support_code.fire_hook(:after_all)
end

def fire_before_all_hook # :nodoc:

:nodoc:
def fire_before_all_hook # :nodoc:
  @support_code.fire_hook(:before_all)
end

def fire_install_plugin_hook # :nodoc:

:nodoc:
def fire_install_plugin_hook # :nodoc:
  @support_code.fire_hook(:install_plugin, @configuration, registry_wrapper)
end

def formatters

def formatters
  @formatters ||=
    @configuration.formatter_factories do |factory, formatter_options, path_or_io|
      create_formatter(factory, formatter_options, path_or_io)
    end
end

def initialize(configuration = Configuration.default)

def initialize(configuration = Configuration.default)
  @configuration = Configuration.new(configuration)
  @support_code = SupportCode.new(self, @configuration)
end

def load_step_definitions

def load_step_definitions
  files = @configuration.support_to_load + @configuration.step_defs_to_load
  @support_code.load_files!(files)
end

def log

def log
  Cucumber.logger
end

def publish_banner_printer

def publish_banner_printer
  @publish_banner_printer ||= Formatter::PublishBannerPrinter.new(@configuration)
end

def registry_wrapper

def registry_wrapper
  Cucumber::Glue::RegistryWrapper.new(@support_code.registry)
end

def report

def report
  return @report if @report
  reports = [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 run!

def run!
  @configuration.notify :envelope, Cucumber::Messages::Envelope.new(
    meta: MetaMessageBuilder.build_meta_message
  )
  load_step_definitions
  fire_install_plugin_hook
  fire_before_all_hook unless dry_run?
  # TODO: can we remove this state?
  self.visitor = report
  receiver = Test::Runner.new(@configuration.event_bus)
  compile features, receiver, filters, @configuration.event_bus
  @configuration.notify :test_run_finished, !failure?
  fire_after_all_hook unless dry_run?
end

def summary_report

def summary_report
  @summary_report ||= Core::Report::Summary.new(@configuration.event_bus)
end

def unmatched_step_definitions

def unmatched_step_definitions
  @support_code.unmatched_step_definitions
end