Class: Undercover::Result

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/undercover/result.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, file_cov, file_path) ⇒ Result

Returns a new instance of Result.



13
14
15
16
17
18
19
20
# File 'lib/undercover/result.rb', line 13

def initialize(node, file_cov, file_path)
  @node = node
  @coverage = file_cov.select do |ln, _|
    first_line == last_line ? ln == first_line : ln > first_line && ln < last_line
  end
  @file_path = file_path
  @flagged = false
end

Instance Attribute Details

#coverageObject (readonly)

Returns the value of attribute coverage.



9
10
11
# File 'lib/undercover/result.rb', line 9

def coverage
  @coverage
end

#file_pathObject (readonly)

Returns the value of attribute file_path.



9
10
11
# File 'lib/undercover/result.rb', line 9

def file_path
  @file_path
end

#nodeObject (readonly)

Returns the value of attribute node.



9
10
11
# File 'lib/undercover/result.rb', line 9

def node
  @node
end

Instance Method Details

#coverage_fObject

Method ‘coverage_f` returns the total coverage of this Undercover::Result as a % value, taking into account missing branches. Line coverage will be counted as 0 if any branch is untested. rubocop:disable Metrics/AbcSize, Metrics/MethodLength



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/undercover/result.rb', line 47

def coverage_f
  lines = {}
  coverage.each do |ln, block_or_line_cov, _, branch_cov|
    lines[ln] = 1 unless lines.key?(ln)
    if branch_cov
      lines[ln] = 0 if branch_cov.zero?
    elsif block_or_line_cov.zero?
      lines[ln] = 0
    end
  end
  return 1.0 if lines.keys.empty?

  (lines.values.sum.to_f / lines.keys.size).round(4)
end

#file_path_with_linesObject

rubocop:enable Metrics/MethodLength, Metrics/AbcSize



105
106
107
# File 'lib/undercover/result.rb', line 105

def file_path_with_lines
  "#{file_path}:#{first_line}:#{last_line}"
end

#flagObject



22
23
24
# File 'lib/undercover/result.rb', line 22

def flag
  @flagged = true
end

#flagged?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/undercover/result.rb', line 26

def flagged?
  @flagged
end

#inspectObject Also known as: to_s



109
110
111
112
# File 'lib/undercover/result.rb', line 109

def inspect
  "#<Undercover::Report::Result:#{object_id} " \
    "name: #{node.name}, coverage: #{coverage_f}>"
end

#pretty_printObject

TODO: move to formatter interface instead!



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/undercover/result.rb', line 83

def pretty_print
  pad = node.last_line.to_s.length
  pretty_print_lines.map do |covered, (num, line)|
    formatted_line = "#{num.to_s.rjust(pad)}: #{line}"
    if line.strip.empty?
      Rainbow(formatted_line).darkgray.dark
    elsif covered.nil?
      Rainbow(formatted_line).darkgray.dark + \
        Rainbow(' hits: n/a').italic.darkgray.dark
    elsif covered.positive?
      Rainbow(formatted_line).green + \
        Rainbow(" hits: #{covered}").italic.darkgray.dark + \
        count_covered_branches(num)
    elsif covered.zero?
      Rainbow(formatted_line).red + \
        Rainbow(" hits: #{covered}").italic.darkgray.dark + \
        count_covered_branches(num)
    end
  end.join("\n")
end

#pretty_print_linesObject

TODO: create a formatter interface instead and add some tests. TODO: re-enable rubocops rubocop:disable Metrics/MethodLength, Metrics/AbcSize

Zips coverage data (that doesn’t include any non-code lines) with full source for given code fragment (this includes non-code lines!)



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/undercover/result.rb', line 69

def pretty_print_lines
  cov_enum = coverage.each
  cov_source_lines = (node.first_line..node.last_line).map do |line_no|
    cov_line_no = begin
      cov_enum.peek[0]
    rescue StopIteration
      -1
    end
    cov_enum.next[1] if cov_line_no == line_no
  end
  cov_source_lines.zip(node.source_lines_with_numbers)
end

#uncovered?(line_no) ⇒ Boolean

rubocop:disable Metrics/CyclomaticComplexity

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
39
40
# File 'lib/undercover/result.rb', line 31

def uncovered?(line_no)
  # check branch coverage for line_no
  coverage.each do |ln, _block, _branch, cov|
    return true if ln == line_no && cov && cov.zero?
  end

  # check line coverage for line_no
  line_cov = coverage.select { |cov| cov.size == 2 }.find { |ln, _cov| ln == line_no }
  line_cov && line_cov[1].zero?
end