class MetricFu::RCovFormatCoverage::TestCoverage

Public Class Methods

floating_percent(numerator, denominator) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 59
def self.floating_percent(numerator, denominator)
  (numerator * 100.0) / denominator.to_f
end
integer_percent(numerator, denominator) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 63
def self.integer_percent(numerator, denominator)
  ::MetricFu::Calculate.integer_percent(numerator, denominator)
end
new(filename_content) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 44
def initialize(filename_content)
  @files = filename_content
  @global_total_lines = 0
  @global_total_lines_run = 0
end
percent_run(lines) { |covered_lines, relevant_lines| ... } click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 67
def self.percent_run(lines)
  line_coverage = RCovLine.line_coverage(lines)
  covered_lines = RCovLine.covered_lines(line_coverage)
  ignored_lines = RCovLine.ignored_lines(line_coverage)
  relevant_lines = lines.count - ignored_lines
  if block_given?
    yield covered_lines, relevant_lines
  else
    floating_percent(covered_lines, relevant_lines)
  end
end

Public Instance Methods

to_h() click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 50
def to_h
  @test_coverage ||= begin
    add_coverage_percentage(@files)
    add_method_data(@files)
    add_global_percent_run(@files, @global_total_lines, @global_total_lines_run)
    @files
  end
end

Private Instance Methods

add_coverage_percentage(files) click to toggle source

TODO: remove multiple side effects

sets global ivars and
modifies the param passed in
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 84
def add_coverage_percentage(files)
  files.each_pair do |fname, content|
    lines = content[:lines]
    percent_run =
      self.class.percent_run(lines) do |covered, relevant|
        @global_total_lines_run += covered
        @global_total_lines += relevant
        self.class.integer_percent(covered, relevant)
      end
    files[fname][:percent_run] = percent_run
  end
end
add_global_percent_run(test_coverage, total_lines, total_lines_run) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 97
def add_global_percent_run(test_coverage, total_lines, total_lines_run)
  percentage = self.class.floating_percent(total_lines_run, total_lines)
  test_coverage.update(
    global_percent_run: round_to_tenths(percentage)
  )
end
add_method_data(test_coverage) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 104
def add_method_data(test_coverage)
  test_coverage.each_pair do |file_path, info|
    file_contents = ""
    coverage = []

    info[:lines].each_with_index do |line, _index|
      file_contents << "#{line[:content]}\n"
      coverage << line[:was_run]
    end

    begin
      line_numbers = MetricFu::LineNumbers.new(file_contents)
    rescue StandardError => e
      raise e unless e.message =~ /you shouldn't be able to get here/
      mf_log "ruby_parser blew up while trying to parse #{file_path}. You won't have method level TestCoverage information for this file."
      next
    end

    method_coverage_map = {}
    coverage.each_with_index do |covered, index|
      line_number = index + 1
      if line_numbers.in_method?(line_number)
        method_name = line_numbers.method_at_line(line_number)
        method_coverage_map[method_name] ||= {}
        method_coverage_map[method_name][:total] ||= 0
        method_coverage_map[method_name][:total] += 1
        method_coverage_map[method_name][:uncovered] ||= 0
        method_coverage_map[method_name][:uncovered] += 1 if !covered
      end
    end

    test_coverage[file_path][:methods] = {}

    method_coverage_map.each do |method_name, coverage_data|
      test_coverage[file_path][:methods][method_name] = (coverage_data[:uncovered] / coverage_data[:total].to_f) * 100.0
    end
  end
end
round_to_tenths(decimal) click to toggle source
# File lib/metric_fu/metrics/rcov/rcov_format_coverage.rb, line 143
def round_to_tenths(decimal)
  decimal = 0.0 if decimal.to_s.eql?("NaN")
  (decimal * 10).round / 10.0
end