diff --git a/lib/gcovinator/file_coverage.rb b/lib/gcovinator/file_coverage.rb index fc4d449..4b4d785 100644 --- a/lib/gcovinator/file_coverage.rb +++ b/lib/gcovinator/file_coverage.rb @@ -1,4 +1,33 @@ module Gcovinator class FileCoverage + + def initialize + @line_counts = {} + @branches = {} + end + + def log_line_count(line_number, count) + @line_counts[line_number] ||= 0 + @line_counts[line_number] += count + end + + def get_line_count(line_number) + @line_counts[line_number] + end + + def log_branch(line_number, branch_id, taken_count, branch_info) + @branches[line_number] ||= {} + @branches[line_number][branch_id] ||= { + taken_count: 0, + branch_info: nil, + } + @branches[line_number][branch_id][:taken_count] += taken_count + @branches[line_number][branch_id][:branch_info] = branch_info + end + + def get_branch(line_number) + @branches[line_number] + end + end end diff --git a/lib/gcovinator/gcov_parser.rb b/lib/gcovinator/gcov_parser.rb index 71ad4f7..d9a46b8 100644 --- a/lib/gcovinator/gcov_parser.rb +++ b/lib/gcovinator/gcov_parser.rb @@ -5,6 +5,7 @@ module Gcovinator def parse(gcov_file, file_coverages, build_dir, source_dirs) gcov_file = File.read(gcov_file) file_coverage = nil + current_line_number = nil gcov_file.each_line do |line| if line =~ /^\s+\S*:\s*\d*:Source:(.*)$/ filename = $1 @@ -20,6 +21,28 @@ module Gcovinator next end next unless file_coverage + if line =~ /^\s*(\S+):\s*(\d+):/ + line_coverage, current_line_number = $1, $2.to_i + if (line_coverage =~ /^#+$/) or + (line_coverage =~ /^\$+$/) or + (line_coverage =~ /^=+$/) + file_coverage.log_line_count(current_line_number, 0) + elsif line_coverage =~ /^\d+$/ + file_coverage.log_line_count(current_line_number, line_coverage.to_i) + end + next + end + if line =~ /^branch\s+(\d+)\s+(.*)$/ + branch_id, taken_extra = $1.to_i, $2 + branch_info = nil + if taken_extra =~ /never.executed/ + taken_count = 0 + elsif taken_extra =~ /taken\s+(\d+)(?:.*\((.*)\))?/ + taken_count = $1.to_i + branch_info = $2 + end + file_coverage.log_branch(current_line_number, branch_id, taken_count, branch_info) + end end end