jekyll/features/support/formatter.rb

84 lines
2.1 KiB
Ruby

# frozen_string_literal: true
require "cucumber/formatter/io"
module Jekyll
module Cucumber
class Formatter
include ::Cucumber::Formatter::Io
def initialize(path_or_io, error_stream)
@io = ensure_io(path_or_io, error_stream)
@timings = {}
end
def before_test_case(test_case)
@timings[timing_key(test_case)] = Time.now
end
def after_test_case(test_case)
@timings[timing_key(test_case)] = Time.now - @timings[timing_key(test_case)]
end
def print_test_case_info(test_case)
@io.print "\n#{test_case.location} #{truncate(test_case.name).inspect} "
@io.flush
end
def print_test_case_duration(test_case)
@io.print format(" (%.3fs)", @timings[timing_key(test_case)])
end
def print_worst_offenders
@io.puts "\n\nWorst offenders:"
rows = @timings.sort_by { |_f, t| -t }.take(10).map! { |r| r[0].split(" \t ", 2).push(r[1]) }
padding = rows.max_by { |r| r[0].length }.first.length + 2
rows.each { |row| @io.puts format_row_data(row, padding) }
end
private
def format_row_data(row, padding)
[
row[0].ljust(padding).rjust(padding + 2),
row[1].ljust(45),
format("(%.3fs)", row[2]),
].join
end
def timing_key(test_case)
"#{test_case.location} \t #{truncate(test_case.name).inspect}"
end
def truncate(input, max_len: 40)
str = input.to_s
str.length > max_len ? "#{str[0..(max_len - 2)]}..." : str
end
end
end
end
InstallPlugin do |config|
progress_fmt = config.to_hash[:formats][0][0] == "progress"
f = Jekyll::Cucumber::Formatter.new($stdout, $stderr)
config.on_event :test_case_started do |event|
test_case = event.test_case
f.print_test_case_info(test_case) if progress_fmt
f.before_test_case(test_case)
end
config.on_event :test_case_finished do |event|
test_case = event.test_case
f.after_test_case(test_case)
f.print_test_case_duration(test_case) if progress_fmt
end
config.on_event :test_run_finished do
f.print_worst_offenders
end
end