class Minitest::Bender

Constants

Colorizer

Attributes

io[RW]
options[RW]
previous_context[R]
results[R]
results_by_context[R]
started_at[R]

Public Class Methods

configuration() click to toggle source
# File lib/minitest/bender.rb, line 22
def configuration
  @configuration ||= MinitestBender::Configuration.new
end
enable!(client_config = {}) click to toggle source
# File lib/minitest/bender.rb, line 12
def enable!(client_config = {})
  @is_enabled = true
  configuration.add_client_config(client_config)
  Colorizer.custom_colors = configuration.custom_colors
end
enabled?() click to toggle source
# File lib/minitest/bender.rb, line 18
def enabled?
  @is_enabled ||= false
end
new(io, options = {}) click to toggle source
# File lib/minitest/bender.rb, line 27
def initialize(io, options = {})
  @io = io
  @options = options
  @previous_context = nil
  @results = []
  @results_by_context = {}
  @time_ranking_is_relevant = false
end

Public Instance Methods

passed?() click to toggle source
# File lib/minitest/bender.rb, line 72
def passed?
  passed_count + skipped_count == run_count
end
record(minitest_result) click to toggle source
# File lib/minitest/bender.rb, line 45
def record(minitest_result)
  flush_stdio

  result = MinitestBender.result_factory.create(minitest_result)
  results << result

  current_context = result.context

  if current_context != previous_context
    recorder.print_context_with_results(previous_context, results_by_context[previous_context]) unless previous_context.nil?
    recorder.print_context(current_context)
    @previous_context = current_context
  end

  (results_by_context[current_context] ||= []) << result

  @time_ranking_is_relevant = true if result.time > 0.01

  if run_count == total_tests_count
    recorder.print_context_with_results(current_context, results_by_context[current_context])
  end

  recorder.print_result(result)

  io.flush
end
report() click to toggle source
# File lib/minitest/bender.rb, line 76
def report
  if results.empty?
    print_no_tests_status
    return
  end

  io.puts
  io.puts
  print_divider(:normal)

  print_sections
end
start() click to toggle source
# File lib/minitest/bender.rb, line 36
def start
  @started_at = Time.now
  io.puts
  io.puts Colorizer.colorize("Minitest started at #{started_at}", :normal)
  io.puts Colorizer.colorize("Options: #{options_args}", :normal)
  io.puts
  io.flush
end

Private Instance Methods

configuration() click to toggle source
# File lib/minitest/bender.rb, line 91
def configuration
  self.class.configuration
end
flush_stdio() click to toggle source
# File lib/minitest/bender.rb, line 95
def flush_stdio
  # as we might already have some output from the test itself,
  # make sure we see *all* of it before we report anything
  STDOUT.flush
  STDERR.flush
end
no_tests_message() click to toggle source
# File lib/minitest/bender.rb, line 169
def no_tests_message
  'NO TESTS WERE RUN!  (-_-)zzz'.freeze
end
options_args() click to toggle source
# File lib/minitest/bender.rb, line 102
def options_args
  options.fetch(:args, '(none)')
end
passed_count() click to toggle source
# File lib/minitest/bender.rb, line 132
def passed_count
  @passed_count ||= results.count(&:passed?)
end
print_divider(color, line_length = 23) click to toggle source
print_no_tests_status() click to toggle source
print_sections() click to toggle source
recorder() click to toggle source
# File lib/minitest/bender.rb, line 106
def recorder
  @recorder ||= begin
    recorder_sym = configuration.recorder
    case recorder_sym
    when :progress
      MinitestBender::Recorders::Progress.new(io, total_tests_count)
    when :progress_groups
      MinitestBender::Recorders::ProgressGroups.new(io, total_tests_count)
    when :progress_issues
      MinitestBender::Recorders::ProgressIssues.new(io, total_tests_count)
    when :progress_groups_and_issues
      MinitestBender::Recorders::ProgressGroupsAndIssues.new(io, total_tests_count)
    when :progress_verbose
      MinitestBender::Recorders::ProgressVerbose.new(io, total_tests_count)
    when :icons
      MinitestBender::Recorders::Icons.new(io)
    when :grouped_icons
      MinitestBender::Recorders::GroupedIcons.new(io)
    when :none
      MinitestBender::Recorders::None.new
    else
      raise "unknown recorder: #{recorder_sym}"
    end
  end
end
run_count() click to toggle source
# File lib/minitest/bender.rb, line 140
def run_count
  results.size
end
section_names() click to toggle source
# File lib/minitest/bender.rb, line 201
def section_names
  configuration.sections
end
sections() click to toggle source
# File lib/minitest/bender.rb, line 182
def sections
  section_names.map do |section_name|
    case section_name
    when :overview
      MinitestBender::Sections::SortedOverview.new(io, results_by_context)
    when :time_ranking
      MinitestBender::Sections::TimeRanking.new(io, time_ranking_size, results)
    when :issues
      MinitestBender::Sections::Issues.new(io)
    when :activity
      MinitestBender::Sections::Activity.new(io, started_at, results)
    when :suite_status
      MinitestBender::Sections::SuiteStatus.new(io, options, results, total_tests_count)
    else
      raise "unknown section: #{section_name}"
    end
  end
end
skipped_count() click to toggle source
# File lib/minitest/bender.rb, line 136
def skipped_count
  @skipped_count ||= results.count(&:skipped?)
end
time_ranking_size() click to toggle source
# File lib/minitest/bender.rb, line 205
def time_ranking_size
  if @time_ranking_is_relevant
    configuration.time_ranking_size
  else
    0
  end
end
total_tests_count() click to toggle source

Minitest should share this with reporters…

# File lib/minitest/bender.rb, line 145
def total_tests_count
  @total_tests_count ||= begin
    filter = options[:filter] || '/./'
    filter = Regexp.new($1) if filter.is_a?(String) && filter =~ %r%/(.*)/%

    exclude = options[:exclude]
    exclude = Regexp.new($1) if exclude.is_a?(String) && exclude =~ %r%/(.*)/%

    Minitest::Runnable.runnables.map do |runnable|
      runnable.runnable_methods.count do |m|
        (filter === m || filter === "#{runnable}##{m}") &&
        !(exclude === m || exclude === "#{runnable}##{m}")
      end
    end.inject(:+)
  end
end