diff --git a/source/reporters/ut_coverage_cobertura_reporter.tpb b/source/reporters/ut_coverage_cobertura_reporter.tpb
index 18221e3d9..56fd4b524 100644
--- a/source/reporters/ut_coverage_cobertura_reporter.tpb
+++ b/source/reporters/ut_coverage_cobertura_reporter.tpb
@@ -1,160 +1,160 @@
-create or replace type body ut_coverage_cobertura_reporter is
- /*
- utPLSQL - Version 3
- Copyright 2016 - 2018 utPLSQL Project
-
- Licensed under the Apache License, Version 2.0 (the "License"):
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
- constructor function ut_coverage_cobertura_reporter(
- self in out nocopy ut_coverage_cobertura_reporter
- ) return self as result is
- begin
- self.init($$plsql_unit);
- return;
- end;
-
-
- overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as
- l_report_lines ut_varchar2_list;
- l_coverage_data ut_coverage.t_coverage;
-
- function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is
- l_file_part varchar2(32767);
- l_result clob;
- l_line_no binary_integer;
- l_pct integer;
- begin
- dbms_lob.createtemporary(l_result, true);
- l_line_no := a_unit_coverage.lines.first;
- if l_line_no is null then
- for i in 1 .. a_unit_coverage.total_lines loop
- ut_utils.append_to_clob(l_result, '');
- end loop;
- else
- while l_line_no is not null loop
- if a_unit_coverage.lines(l_line_no).executions = 0 then
- l_file_part := ''||chr(10);
- else
- l_file_part := ''||chr(10);
- end if;
- ut_utils.append_to_clob(l_result, l_file_part);
- l_line_no := a_unit_coverage.lines.next(l_line_no);
- end loop;
- end if;
- return l_result;
- end;
-
- function get_coverage_xml(
- a_coverage_data ut_coverage.t_coverage,
- a_run ut_run
- ) return ut_varchar2_rows is
- l_file_part varchar2(32767);
- l_result ut_varchar2_rows := ut_varchar2_rows();
- l_unit ut_coverage.t_full_name;
- l_obj_name ut_coverage.t_object_name;
- c_coverage_def constant varchar2(200) := '';
- c_file_footer constant varchar2(30) := '';
- c_coverage_footer constant varchar2(30) := '';
- c_sources_footer constant varchar2(30) := '';
- c_packages_footer constant varchar2(30) := '';
- c_package_footer constant varchar2(30) := '';
- c_class_footer constant varchar2(30) := '';
- c_lines_footer constant varchar2(30) := '';
- l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
- begin
-
- ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
- ut_utils.append_to_list( l_result, c_coverage_def );
-
- --write header
- ut_utils.append_to_list(
- l_result,
- ''
- );
-
-
- --Write sources
- l_unit := a_coverage_data.objects.first;
- ut_utils.append_to_list( l_result, '' );
-
- while l_unit is not null loop
- ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||'');
- l_unit := a_coverage_data.objects.next(l_unit);
- end loop;
- ut_utils.append_to_list(l_result, c_sources_footer);
-
- --write packages
- l_unit := a_coverage_data.objects.first;
- ut_utils.append_to_list(l_result, '');
-
- while l_unit is not null loop
- l_obj_name := a_coverage_data.objects(l_unit).name;
- ut_utils.append_to_list(
- l_result,
- ''
- );
-
- ut_utils.append_to_list(
- l_result,
- ''
- );
-
- ut_utils.append_to_list(l_result, '');
-
- ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
-
- ut_utils.append_to_list(l_result, c_lines_footer);
- ut_utils.append_to_list(l_result, c_class_footer);
- ut_utils.append_to_list(l_result, c_package_footer);
-
- l_unit := a_coverage_data.objects.next(l_unit);
- end loop;
-
- ut_utils.append_to_list(l_result, c_packages_footer);
- ut_utils.append_to_list(l_result, c_coverage_footer);
- return l_result;
- end;
- begin
- ut_coverage.coverage_stop();
-
- l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
-
- self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
-
- (self as ut_reporter_base).after_calling_run(a_run);
- end;
-
- overriding member function get_description return varchar2 as
- begin
- return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) ||
- 'Designed for Jenkins and TFS to report coverage. ' || chr(10) ||
- 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) ||
- 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.';
- end;
-
-end;
-/
+create or replace type body ut_coverage_cobertura_reporter is
+ /*
+ utPLSQL - Version 3
+ Copyright 2016 - 2018 utPLSQL Project
+
+ Licensed under the Apache License, Version 2.0 (the "License"):
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+ constructor function ut_coverage_cobertura_reporter(
+ self in out nocopy ut_coverage_cobertura_reporter
+ ) return self as result is
+ begin
+ self.init($$plsql_unit);
+ return;
+ end;
+
+
+ overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as
+ l_report_lines ut_varchar2_list;
+ l_coverage_data ut_coverage.t_coverage;
+
+ function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is
+ l_file_part varchar2(32767);
+ l_result clob;
+ l_line_no binary_integer;
+ l_pct integer;
+ begin
+ dbms_lob.createtemporary(l_result, true);
+ l_line_no := a_unit_coverage.lines.first;
+ if l_line_no is null then
+ for i in 1 .. a_unit_coverage.total_lines loop
+ ut_utils.append_to_clob(l_result, ''||chr(10));
+ end loop;
+ else
+ while l_line_no is not null loop
+ if a_unit_coverage.lines(l_line_no).executions = 0 then
+ l_file_part := ''||chr(10);
+ else
+ l_file_part := ''||chr(10);
+ end if;
+ ut_utils.append_to_clob(l_result, l_file_part);
+ l_line_no := a_unit_coverage.lines.next(l_line_no);
+ end loop;
+ end if;
+ return l_result;
+ end;
+
+ function get_coverage_xml(
+ a_coverage_data ut_coverage.t_coverage,
+ a_run ut_run
+ ) return ut_varchar2_rows is
+ l_file_part varchar2(32767);
+ l_result ut_varchar2_rows := ut_varchar2_rows();
+ l_unit ut_coverage.t_full_name;
+ l_obj_name ut_coverage.t_object_name;
+ c_coverage_def constant varchar2(200) := '';
+ c_file_footer constant varchar2(30) := '';
+ c_coverage_footer constant varchar2(30) := '';
+ c_sources_footer constant varchar2(30) := '';
+ c_packages_footer constant varchar2(30) := '';
+ c_package_footer constant varchar2(30) := '';
+ c_class_footer constant varchar2(30) := '';
+ c_lines_footer constant varchar2(30) := '';
+ l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
+ begin
+
+ ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
+ ut_utils.append_to_list( l_result, c_coverage_def );
+
+ --write header
+ ut_utils.append_to_list(
+ l_result,
+ ''
+ );
+
+
+ --Write sources
+ l_unit := a_coverage_data.objects.first;
+ ut_utils.append_to_list( l_result, '' );
+
+ while l_unit is not null loop
+ ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||'');
+ l_unit := a_coverage_data.objects.next(l_unit);
+ end loop;
+ ut_utils.append_to_list(l_result, c_sources_footer);
+
+ --write packages
+ l_unit := a_coverage_data.objects.first;
+ ut_utils.append_to_list(l_result, '');
+
+ while l_unit is not null loop
+ l_obj_name := a_coverage_data.objects(l_unit).name;
+ ut_utils.append_to_list(
+ l_result,
+ ''
+ );
+
+ ut_utils.append_to_list(
+ l_result,
+ ''
+ );
+
+ ut_utils.append_to_list(l_result, '');
+
+ ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
+
+ ut_utils.append_to_list(l_result, c_lines_footer);
+ ut_utils.append_to_list(l_result, c_class_footer);
+ ut_utils.append_to_list(l_result, c_package_footer);
+
+ l_unit := a_coverage_data.objects.next(l_unit);
+ end loop;
+
+ ut_utils.append_to_list(l_result, c_packages_footer);
+ ut_utils.append_to_list(l_result, c_coverage_footer);
+ return l_result;
+ end;
+ begin
+ ut_coverage.coverage_stop();
+
+ l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
+
+ self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
+
+ (self as ut_reporter_base).after_calling_run(a_run);
+ end;
+
+ overriding member function get_description return varchar2 as
+ begin
+ return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) ||
+ 'Designed for Jenkins and TFS to report coverage. ' || chr(10) ||
+ 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) ||
+ 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.';
+ end;
+
+end;
+/
diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh
index be7857346..01bd378fb 100755
--- a/test/install_and_run_tests.sh
+++ b/test/install_and_run_tests.sh
@@ -20,10 +20,11 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO
-source_path=source -owner=ut3 \
-p='ut3_tester,ut3$user#' \
-test_path=test -c \
--f=ut_coverage_sonar_reporter -o=coverage.xml \
--f=ut_coverage_html_reporter -o=coverage.html \
--f=ut_coveralls_reporter -o=coverage.json \
--f=ut_sonar_test_reporter -o=test_results.xml \
--f=ut_junit_reporter -o=junit_test_results.xml \
--f=ut_tfs_junit_reporter -o=tfs_test_results.xml \
--f=ut_documentation_reporter -o=test_results.log -s
+-f=ut_coverage_sonar_reporter -o=coverage.xml \
+-f=ut_coverage_cobertura_reporter -o=cobertura.xml \
+-f=ut_coverage_html_reporter -o=coverage.html \
+-f=ut_coveralls_reporter -o=coverage.json \
+-f=ut_sonar_test_reporter -o=test_results.xml \
+-f=ut_junit_reporter -o=junit_test_results.xml \
+-f=ut_tfs_junit_reporter -o=tfs_test_results.xml \
+-f=ut_documentation_reporter -o=test_results.log -s
diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb
index ecfb66340..b3c0439b4 100644
--- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb
+++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb
@@ -41,5 +41,61 @@ create or replace package body test_cov_cobertura_reporter is
ut.expect(l_actual).to_be_like(l_expected);
end;
+ procedure report_zero_coverage is
+ l_results ut3.ut_varchar2_list;
+ l_expected clob;
+ l_actual clob;
+ begin
+ --Arrange
+ l_expected :=
+ q'[
+
+
+
+ut3.dummy_coverage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+]';
+
+ test_coverage.cleanup_dummy_coverage;
+ --Act
+ select *
+ bulk collect into l_results
+ from table(
+ ut3.ut.run(
+ a_path => 'ut3.test_dummy_coverage',
+ a_reporter=> ut3.ut_coverage_cobertura_reporter( ),
+ a_include_objects => ut3.ut_varchar2_list('UT3.DUMMY_COVERAGE')
+ )
+ );
+ l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results);
+ --Assert
+ ut.expect(l_actual).to_be_like(l_expected);
+ --Cleanup
+ test_coverage.setup_dummy_coverage;
+ end;
+
end;
/
diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks
index 365815964..0016641d5 100644
--- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks
+++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks
@@ -6,5 +6,8 @@ create or replace package test_cov_cobertura_reporter is
--%test(reports on a project file mapped to database object)
procedure report_on_file;
+ --%test(reports zero coverage on each line of non-executed database object - Issue #917)
+ procedure report_zero_coverage;
+
end test_cov_cobertura_reporter;
/