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

Skip to content

Commit ab7eb24

Browse files
committed
Refactor Coverage to now enrich profile for partially covered lines using block coverage.
1 parent 49b1b84 commit ab7eb24

1 file changed

Lines changed: 29 additions & 93 deletions

File tree

source/core/coverage/ut_coverage_extended.pkb

Lines changed: 29 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -21,103 +21,39 @@ create or replace package body ut_coverage_extended is
2121
*/
2222

2323
function get_extended_coverage(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
24-
l_result ut_coverage.t_coverage;
25-
l_result_block ut_coverage.t_coverage;
26-
l_result_profiler ut_coverage.t_coverage;
27-
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
28-
l_source_object ut_coverage_helper.t_tmp_table_object;
29-
l_new_unit ut_coverage.t_unit_coverage;
30-
l_line_no binary_integer;
24+
l_result_block ut_coverage.t_coverage;
25+
l_result_profiler_enrich ut_coverage.t_coverage;
26+
l_object ut_coverage.t_full_name;
27+
l_line_no binary_integer;
3128
begin
29+
ut_coverage_helper.cleanup_tmp_table();
3230
l_result_block := ut_coverage_block.get_coverage_data_block(a_coverage_options => a_coverage_options);
33-
l_result_profiler:= ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
31+
ut_coverage_helper.cleanup_tmp_table();
32+
l_result_profiler_enrich:= ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
3433

35-
36-
ut_coverage.populate_tmp_table(a_coverage_options,ut_coverage.get_cov_sources_sql(a_coverage_options,'N'));
37-
38-
l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
39-
loop
40-
fetch l_source_objects_crsr
41-
into l_source_object;
42-
exit when l_source_objects_crsr%notfound;
43-
--check if we have a hits in any of reporters
44-
if l_result_block.total_lines > 0 or l_result_profiler.total_lines > 0 then
45-
--update total stats
46-
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
47-
l_result.total_blocks := nvl(l_result_block.total_blocks,0);
48-
l_result.uncovered_blocks := nvl(l_result_block.uncovered_blocks,0);
49-
l_result.covered_blocks := nvl(l_result_block.covered_blocks,0);
50-
l_result.partcovered_lines := nvl(l_result_block.partcovered_lines,0);
51-
52-
--populate object level coverage stats
53-
if not l_result.objects.exists(l_source_object.full_name) then
54-
l_result.objects(l_source_object.full_name) := l_new_unit;
55-
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
56-
l_result.objects(l_source_object.full_name).name := l_source_object.name;
57-
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
58-
l_result.objects(l_source_object.full_name).total_blocks := nvl(l_result_block.objects(l_source_object.full_name).total_blocks,0);
59-
l_result.objects(l_source_object.full_name).uncovered_blocks := nvl(l_result_block.objects(l_source_object.full_name).uncovered_blocks,0);
60-
l_result.objects(l_source_object.full_name).covered_blocks := nvl(l_result_block.objects(l_source_object.full_name).covered_blocks,0);
61-
l_result.objects(l_source_object.full_name).partcovered_lines := nvl(l_result_block.objects(l_source_object.full_name).partcovered_lines,0);
34+
-- Enrich profiler results with some of the block results
35+
l_object := l_result_profiler_enrich.objects.first;
36+
while (l_object is not null)
37+
loop
38+
l_line_no := l_result_profiler_enrich.objects(l_object).lines.first;
39+
while (l_line_no is not null)
40+
loop
41+
if l_result_block.objects(l_object).lines.exists(l_line_no) then
42+
-- enrich line level stats
43+
l_result_profiler_enrich.objects(l_object).lines(l_line_no).partcove := l_result_block.objects(l_object).lines(l_line_no).partcove;
44+
-- enrich object level stats
45+
l_result_profiler_enrich.objects(l_object).partcovered_lines := nvl(l_result_profiler_enrich.objects(l_object).partcovered_lines,0) + l_result_block.objects(l_object).lines(l_line_no).partcove;
6246
end if;
63-
64-
l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.first,
65-
l_result_profiler.objects(l_source_object.full_name).lines.first);
66-
67-
if l_line_no is null then
68-
l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
69-
l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
70-
else
71-
loop
72-
exit when l_line_no is null;
73-
74-
-- Set executions to zero at beginning, specific coverage will overwrite if exists.
75-
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 0;
76-
l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := 0;
77-
l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := 0;
78-
l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := 0;
79-
80-
-- we need to check if given index exists for that coverage type or we get no data found
81-
if l_result_block.objects(l_source_object.full_name).lines.exists(l_line_no) then
82-
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);
83-
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);
84-
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);
85-
--We capture block executions here, since block coverage do not capture more than 1
86-
--if profiler executions exists we will use that number as profiler shows hits correctly
87-
88-
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;
89-
end if;
90-
91-
if l_result_profiler.objects(l_source_object.full_name).lines.exists(l_line_no) then
92-
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;
93-
end if;
94-
95-
-- Recalculate total lines
96-
if l_result.objects(l_source_object.full_name).lines(l_line_no).executions > 0 then
97-
-- total level stats
98-
l_result.executions := l_result.executions + l_result.objects(l_source_object.full_name).lines(l_line_no).executions;
99-
l_result.covered_lines := l_result.covered_lines + 1;
100-
-- object level stats
101-
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
102-
.covered_lines + 1;
103-
elsif l_result.objects(l_source_object.full_name).lines(l_line_no).executions = 0 then
104-
-- total level stats
105-
l_result.uncovered_lines := l_result.uncovered_lines + 1;
106-
-- object level stats
107-
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name)
108-
.uncovered_lines + 1;
109-
end if;
110-
111-
l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
112-
l_result_profiler.objects(l_source_object.full_name).lines.next(l_line_no));
113-
114-
end loop;
115-
end if;
116-
end if;
117-
118-
end loop;
119-
close l_source_objects_crsr;
120-
return l_result;
47+
--At the end go to next line
48+
l_line_no := l_result_profiler_enrich.objects(l_object).lines.next(l_line_no);
49+
end loop;
50+
--total level stats enrich
51+
l_result_profiler_enrich.partcovered_lines := nvl(l_result_profiler_enrich.partcovered_lines,0) + l_result_profiler_enrich.objects(l_object).partcovered_lines;
52+
-- At the end go to next object
53+
l_object := l_result_profiler_enrich.objects.next(l_object);
54+
end loop;
55+
56+
return l_result_profiler_enrich;
12157

12258
end get_extended_coverage;
12359

0 commit comments

Comments
 (0)