|
require 'set' |
|
require 'ansi/code' |
|
|
|
module Minitest |
|
module Reporters |
|
class TurnReporter < BaseReporter |
|
include ANSI::Code |
|
include RelativePosition |
|
|
|
INDENT = ' ' |
|
RESULT = { pass: ANSI::Code.green { ' PASS' }, |
|
error: ANSI::Code.yellow { ' ERROR' }, |
|
fail: ANSI::Code.red { ' FAIL' }, |
|
skip: ANSI::Code.cyan { ' SKIP' } } |
|
|
|
def report |
|
super |
|
puts |
|
puts('Finished in %.5fs' % total_time) |
|
print('%d tests, %d assertions, ' % [count, assertions]) |
|
color = failures.zero? && errors.zero? ? :green : :red |
|
print(send(color) { '%d failures, %d errors, ' } % [failures, errors]) |
|
print(yellow { '%d skips' } % skips) |
|
puts |
|
print_suites |
|
end |
|
|
|
def record(test) |
|
test_result = result(test) |
|
print INDENT + RESULT[test_result] + ' ' |
|
print_time test.time |
|
print human(test.name) |
|
puts |
|
if !test.skipped? && test.failure |
|
print_info(test.failure) |
|
puts |
|
end |
|
suites[test_result] << test.class.name |
|
super |
|
end |
|
|
|
protected |
|
|
|
def human(name) |
|
name.to_s.gsub('_', ' ').sub(/\Atest (: )?/, '') |
|
end |
|
|
|
def print_time(t) |
|
h, t = t.divmod(3600) |
|
m, t = t.divmod(60) |
|
s = t.truncate |
|
f = ((t - s) * 100).to_i |
|
|
|
print "(#{'%02d:%02d.%02d' % [m,s,f]}) " |
|
end |
|
|
|
def before_suite(suite) |
|
puts |
|
puts suite |
|
end |
|
|
|
def suites |
|
@suites ||= { pass: Set.new, error: Set.new, fail: Set.new, skip: Set.new } |
|
end |
|
|
|
def print_suites |
|
suites[:pass].subtract(suites[:error] + suites[:fail] + suites[:skip]) |
|
|
|
if number_of_suites > 1 && (suites[:skip].any? || suites[:fail].any? || suites[:error].any?) |
|
puts "\nResults:\n" |
|
[:skip, :fail, :error].each do |result| |
|
suites[result].each { |suite| puts "#{INDENT}#{RESULT[result]} #{suite}" } |
|
end |
|
puts |
|
end |
|
end |
|
|
|
def number_of_suites |
|
suites.values.map(&:size).sum |
|
end |
|
|
|
end |
|
end |
|
end |