Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d8b8e87

Browse files
committed
Updated coverage with statement level information
1 parent 1f51049 commit d8b8e87

2 files changed

Lines changed: 34 additions & 23 deletions

File tree

source/core/coverage/ut_coverage.pkb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ create or replace package body ut_coverage is
102102
end;
103103

104104
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
105-
l_line_no binary_integer;
106105
begin
107106

108107
if a_coverage_options.coverage_type = gc_block_coverage then

source/core/coverage/ut_coverage_extended.pkb

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -104,24 +104,24 @@ create or replace package body ut_coverage_extended is
104104
if l_result_block.total_lines > 0 or l_result_profiler.total_lines > 0 then
105105
--update total stats
106106
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
107-
l_result.total_blocks := l_result_block.total_blocks;
108-
l_result.uncovered_blocks := l_result_block.uncovered_blocks;
109-
l_result.covered_blocks := l_result_block.covered_blocks;
110-
l_result.partcovered_lines := l_result_block.partcovered_lines;
107+
l_result.total_blocks := nvl(l_result_block.total_blocks,0);
108+
l_result.uncovered_blocks := nvl(l_result_block.uncovered_blocks,0);
109+
l_result.covered_blocks := nvl(l_result_block.covered_blocks,0);
110+
l_result.partcovered_lines := nvl(l_result_block.partcovered_lines,0);
111111

112112
--populate object level coverage stats
113113
if not l_result.objects.exists(l_source_object.full_name) then
114114
l_result.objects(l_source_object.full_name) := l_new_unit;
115115
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
116-
l_result.objects(l_source_object.full_name).name := l_source_object.name;
116+
l_result.objects(l_source_object.full_name).name := l_source_object.name;
117117
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
118-
l_result.objects(l_source_object.full_name).total_blocks := l_result_block.objects(l_source_object.full_name).total_blocks;
119-
l_result.objects(l_source_object.full_name).uncovered_blocks := l_result_block.objects(l_source_object.full_name).uncovered_blocks;
120-
l_result.objects(l_source_object.full_name).covered_blocks := l_result_block.objects(l_source_object.full_name).covered_blocks;
121-
l_result.objects(l_source_object.full_name).partcovered_lines := l_result_block.objects(l_source_object.full_name).partcovered_lines;
118+
l_result.objects(l_source_object.full_name).total_blocks := nvl(l_result_block.objects(l_source_object.full_name).total_blocks,0);
119+
l_result.objects(l_source_object.full_name).uncovered_blocks := nvl(l_result_block.objects(l_source_object.full_name).uncovered_blocks,0);
120+
l_result.objects(l_source_object.full_name).covered_blocks := nvl(l_result_block.objects(l_source_object.full_name).covered_blocks,0);
121+
l_result.objects(l_source_object.full_name).partcovered_lines := nvl(l_result_block.objects(l_source_object.full_name).partcovered_lines,0);
122122
end if;
123123

124-
l_line_no := coalesce(l_result_block.objects(l_source_object.full_name).lines.first,
124+
l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.first,
125125
l_result_profiler.objects(l_source_object.full_name).lines.first);
126126

127127
if l_line_no is null then
@@ -130,24 +130,36 @@ create or replace package body ut_coverage_extended is
130130
else
131131
loop
132132
exit when l_line_no is null;
133-
-- object level stats
134-
135-
-- Failing on non existing data for block objects.Check if exists and then use it
136-
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := greatest(l_result_block.objects(l_source_object.full_name).lines(l_line_no).executions,
137-
l_result_profiler.objects(l_source_object.full_name).lines(l_line_no).executions);
138-
l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).no_blocks,0);
139-
l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).covered_blocks,0);
140-
l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := l_result_block.objects(l_source_object.full_name).lines(l_line_no).partcove;
141-
-- total level stats
133+
134+
-- Set executions to zero at beginning, specific coverage will overwrite if exists.
135+
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 0;
136+
l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := 0;
137+
l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := 0;
138+
l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := 0;
139+
140+
-- we need to check if given index exists for that coverage type or we get no data found
141+
if l_result_block.objects(l_source_object.full_name).lines.exists(l_line_no) then
142+
l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).no_blocks,0);
143+
l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).covered_blocks,0);
144+
l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).partcove,0);
145+
--We capture block executions here, since block coverage do not capture more than 1
146+
--if profiler executions exists we will use that number as profiler shows hits correctly
147+
148+
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_block.objects(l_source_object.full_name).lines(l_line_no).executions;
149+
end if;
150+
151+
if l_result_profiler.objects(l_source_object.full_name).lines.exists(l_line_no) then
152+
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_profiler.objects(l_source_object.full_name).lines(l_line_no).executions;
153+
end if;
142154

143155
-- Recalculate total lines
144156
if l_result.objects(l_source_object.full_name).lines(l_line_no).executions > 0 then
145157
-- total level stats
146158
l_result.executions := l_result.executions + l_result.objects(l_source_object.full_name).lines(l_line_no).executions;
147159
l_result.covered_lines := l_result.covered_lines + 1;
148160
-- object level stats
149-
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
150-
.uncovered_lines + 1;
161+
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
162+
.covered_lines + 1;
151163
elsif l_result.objects(l_source_object.full_name).lines(l_line_no).executions = 0 then
152164
-- total level stats
153165
l_result.uncovered_lines := l_result.uncovered_lines + 1;
@@ -156,7 +168,7 @@ create or replace package body ut_coverage_extended is
156168
.uncovered_lines + 1;
157169
end if;
158170

159-
l_line_no := coalesce(l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
171+
l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
160172
l_result_profiler.objects(l_source_object.full_name).lines.next(l_line_no));
161173

162174
end loop;

0 commit comments

Comments
 (0)