@@ -29,23 +29,34 @@ create or replace type body ut_coverage_cobertura_reporter is
2929 l_report_lines ut_varchar2_list;
3030 l_coverage_data ut_coverage.t_coverage;
3131
32- function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is
32+ function get_line_rate(a_lines_covered in integer, a_lines_hit in integer) return varchar2 is
33+ begin
34+ return to_char(round((case a_lines_covered when 0 then 0 else a_lines_covered/a_lines_hit end), 17), rpad('FM0.0',20,'9') , 'NLS_NUMERIC_CHARACTERS=''. ''');
35+ end;
36+
37+ procedure get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage,
38+ a_lines_result in out nocopy clob, a_lines_hits out number, a_lines_total out number) is
3339 l_file_part varchar2(32767);
3440 l_result clob;
3541 l_line_no binary_integer;
3642 l_pct integer;
43+ l_lines_hits integer := 0;
44+ l_lines_total integer := 0;
3745 begin
3846 dbms_lob.createtemporary(l_result, true);
3947 l_line_no := a_unit_coverage.lines.first;
4048 if l_line_no is null then
4149 for i in 1 .. a_unit_coverage.total_lines loop
4250 ut_utils.append_to_clob(l_result, '<line number="'||i||'" hits="0" branch="false"/>'||chr(10));
4351 end loop;
52+ l_lines_hits:=0;
53+ l_lines_total:= a_unit_coverage.total_lines;
4454 else
4555 while l_line_no is not null loop
4656 if a_unit_coverage.lines(l_line_no).executions = 0 then
4757 l_file_part := '<line number="'||l_line_no||'" hits="0" branch="false"/>'||chr(10);
4858 else
59+ l_lines_hits:= l_lines_hits+1;
4960 l_file_part := '<line number="'||l_line_no||'" hits="'||a_unit_coverage.lines(l_line_no).executions||'"';
5061 if a_unit_coverage.lines(l_line_no).covered_blocks < a_unit_coverage.lines(l_line_no).no_blocks then
5162 l_file_part := l_file_part || ' branch="true"';
@@ -59,16 +70,21 @@ create or replace type body ut_coverage_cobertura_reporter is
5970 end if;
6071 ut_utils.append_to_clob(l_result, l_file_part);
6172 l_line_no := a_unit_coverage.lines.next(l_line_no);
73+ l_lines_total := l_lines_total + 1;
6274 end loop;
6375 end if;
64- return l_result;
76+ a_lines_result := l_result;
77+ a_lines_hits :=l_lines_hits;
78+ a_lines_total := l_lines_total;
6579 end;
6680
6781 function get_coverage_xml(
6882 a_coverage_data ut_coverage.t_coverage,
6983 a_run ut_run
7084 ) return ut_varchar2_rows is
85+
7186 l_file_part varchar2(32767);
87+ l_lines_xml clob;
7288 l_result ut_varchar2_rows := ut_varchar2_rows();
7389 l_unit ut_coverage.t_object_name;
7490 l_obj_name ut_coverage.t_object_name;
@@ -83,6 +99,8 @@ create or replace type body ut_coverage_cobertura_reporter is
8399 c_lines_footer constant varchar2(30) := '</lines>';
84100 l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
85101 l_lines_valid integer := a_coverage_data.covered_lines + a_coverage_data.uncovered_lines;
102+ l_line_hits integer;
103+ l_line_total integer;
86104 begin
87105
88106 ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
@@ -92,7 +110,7 @@ create or replace type body ut_coverage_cobertura_reporter is
92110 ut_utils.append_to_list(
93111 l_result,
94112 '<coverage line-rate="'
95- ||to_char(round((case l_lines_valid when 0 then 0 else a_coverage_data.covered_lines/(l_lines_valid) end), 17), rpad('FM0.0',20,'9') , 'NLS_NUMERIC_CHARACTERS=''. ''' )
113+ ||get_line_rate( a_coverage_data.covered_lines,l_lines_valid )
96114 ||'" branch-rate="0.0" lines-covered="'
97115 ||a_coverage_data.covered_lines||'" lines-valid="'
98116 ||to_char(l_lines_valid)
@@ -116,9 +134,12 @@ create or replace type body ut_coverage_cobertura_reporter is
116134
117135 while l_unit is not null loop
118136 l_obj_name := a_coverage_data.objects(l_unit).name;
137+ dbms_lob.createtemporary(l_lines_xml, true);
138+ get_lines_xml(a_coverage_data.objects(l_unit),l_lines_xml,l_line_hits,l_line_total);
139+
119140 ut_utils.append_to_list(
120141 l_result,
121- '<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0 " branch-rate="0.0" complexity="0.0">'
142+ '<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="'||get_line_rate(l_line_hits,l_line_total)||' " branch-rate="0.0" complexity="0.0">'
122143 );
123144
124145 ut_utils.append_to_list(
@@ -129,13 +150,13 @@ create or replace type body ut_coverage_cobertura_reporter is
129150 ut_utils.append_to_list(
130151 l_result,
131152 '<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'
132- ||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0 " branch-rate="0.0" complexity="0.0">'
153+ ||dbms_xmlgen.convert(l_unit)||'" line-rate="'||get_line_rate(l_line_hits,l_line_total)||' " branch-rate="0.0" complexity="0.0">'
133154 );
134155
135156 ut_utils.append_to_list(l_result, '<lines>');
136-
137- ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
138-
157+ ut_utils.append_to_list( l_result,l_lines_xml);
158+ dbms_lob.freetemporary(l_lines_xml );
159+
139160 ut_utils.append_to_list(l_result, c_lines_footer);
140161 ut_utils.append_to_list(l_result, c_class_footer);
141162 ut_utils.append_to_list(l_result, c_classes_footer);
0 commit comments