class ParallelTests::Gherkin::Runner

def cucumber_opts(given)

def cucumber_opts(given)
  if given =~ /--profile/ or given =~ /(^|\s)-p /
    given
  else
    [given, profile_from_config].compact.join(" ")
  end
end

def determine_executable

def determine_executable
  case
    when File.exists?("bin/#{name}")
      "bin/#{name}"
    when ParallelTests.bundler_enabled?
      "bundle exec #{name}"
    when File.file?("script/#{name}")
      "script/#{name}"
    else
      "#{name}"
  end
end

def line_is_result?(line)

def line_is_result?(line)
  line =~ /^\d+ (steps?|scenarios?)/
end

def profile_from_config

def profile_from_config
  # copied from https://github.com/cucumber/cucumber/blob/master/lib/cucumber/cli/profile_loader.rb#L85
  config = Dir.glob("{,.config/,config/}#{name}{.yml,.yaml}").first
  if config && File.read(config) =~ /^parallel:/
    "--profile parallel"
  end
end

def run_tests(test_files, process_number, num_processes, options)

def run_tests(test_files, process_number, num_processes, options)
  sanitized_test_files = test_files.map { |val| Shellwords.escape(val) }
  options = options.merge(:env => {"AUTOTEST" => "1"}) if $stdout.tty? # display color when we are in a terminal
  cmd = [
    executable,
    (runtime_logging if File.directory?(File.dirname(runtime_log))),
    cucumber_opts(options[:test_options]),
    *sanitized_test_files
  ].compact.join(" ")
  execute_command(cmd, process_number, num_processes, options)
end

def runtime_log

def runtime_log
  "tmp/parallel_runtime_#{name}.log"
end

def runtime_logging

def runtime_logging
  " --format ParallelTests::Gherkin::RuntimeLogger --out #{runtime_log}"
end

def summarize_results(results)

1 step (1 failed)
1 scenario (1 failed)
cucumber has 2 result lines per test run, that cannot be added
def summarize_results(results)
  sort_order = %w[scenario step failed undefined skipped pending passed]
  %w[scenario step].map do |group|
    group_results = results.grep /^\d+ #{group}/
    next if group_results.empty?
    sums = sum_up_results(group_results)
    sums = sums.sort_by { |word, _| sort_order.index(word) || 999 }
    sums.map! do |word, number|
      plural = "s" if word == group and number != 1
      "#{number} #{word}#{plural}"
    end
    "#{sums[0]} (#{sums[1..-1].join(", ")})"
  end.compact.join("\n")
end

def test_file_name

def test_file_name
  "feature"
end

def test_suffix

def test_suffix
  ".feature"
end

def tests_in_groups(tests, num_groups, options={})

def tests_in_groups(tests, num_groups, options={})
  if options[:group_by] == :steps
    Grouper.by_steps(find_tests(tests, options), num_groups, options)
  else
    super
  end
end