All files (95.04% lines covered at 588 hits/line)
102 files in total.
4741 relevant lines. 4506 lines covered (including 20 lines partially covered ) and 235 lines missed.
UT3.UT
93.2 % lines covered
103 relevant lines. 96 lines covered and 7 lines missed
package body ut is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
g_nls_date_format varchar2(4000);
- 1
gc_fail_on_errors constant boolean := false;
g_result_line_no binary_integer;
- 1
g_result_lines ut_varchar2_list := ut_varchar2_list();
function version return varchar2 is
begin
- 117
return ut_runner.version();
end;
function expect(a_actual in anydata, a_message varchar2 := null) return ut_expectation_compound is
begin
- 109
return ut_expectation_compound(ut_data_value_anydata(a_actual), a_message);
end;
function expect(a_actual in blob, a_message varchar2 := null) return ut_expectation is
begin
- 23
return ut_expectation(ut_data_value_blob(a_actual), a_message);
end;
function expect(a_actual in boolean, a_message varchar2 := null) return ut_expectation is
begin
- 29
return ut_expectation(ut_data_value_boolean(a_actual), a_message);
end;
function expect(a_actual in clob, a_message varchar2 := null) return ut_expectation is
begin
- 48
return ut_expectation(ut_data_value_clob(a_actual), a_message);
end;
function expect(a_actual in date, a_message varchar2 := null) return ut_expectation is
begin
- 42
return ut_expectation(ut_data_value_date(a_actual), a_message);
end;
function expect(a_actual in number, a_message varchar2 := null) return ut_expectation is
begin
- 122
return ut_expectation(ut_data_value_number(a_actual), a_message);
end;
function expect(a_actual in timestamp_unconstrained, a_message varchar2 := null) return ut_expectation is
begin
- 42
return ut_expectation(ut_data_value_timestamp(a_actual), a_message);
end;
function expect(a_actual in timestamp_ltz_unconstrained, a_message varchar2 := null) return ut_expectation is
begin
- 44
return ut_expectation(ut_data_value_timestamp_ltz(a_actual), a_message);
end;
function expect(a_actual in timestamp_tz_unconstrained, a_message varchar2 := null) return ut_expectation is
begin
- 40
return ut_expectation(ut_data_value_timestamp_tz(a_actual), a_message);
end;
function expect(a_actual in varchar2, a_message varchar2 := null) return ut_expectation is
begin
- 57
return ut_expectation(ut_data_value_varchar2(a_actual), a_message);
end;
function expect(a_actual in sys_refcursor, a_message varchar2 := null) return ut_expectation_compound is
begin
- 153
return ut_expectation_compound(ut_data_value_refcursor(a_actual), a_message);
end;
function expect(a_actual in yminterval_unconstrained, a_message varchar2 := null) return ut_expectation is
begin
- 34
return ut_expectation(ut_data_value_yminterval(a_actual), a_message);
end;
function expect(a_actual in dsinterval_unconstrained, a_message varchar2 := null) return ut_expectation is
begin
- 34
return ut_expectation(ut_data_value_dsinterval(a_actual), a_message);
end;
function expect(a_actual in json_element_t , a_message varchar2 := null) return ut_expectation_json is
begin
- 23
return ut_expectation_json(ut_data_value_json(a_actual), a_message);
end;
procedure fail(a_message in varchar2) is
begin
- 1
ut_expectation_processor.report_failure(a_message);
end;
procedure raise_if_packages_invalidated is
e_package_invalidated exception;
pragma exception_init (e_package_invalidated, -04068);
begin
- 113
if ut_expectation_processor.invalidation_exception_found() then
- 1
ut_expectation_processor.reset_invalidation_exception();
- 1
raise e_package_invalidated;
end if;
end;
procedure run_autonomous(
a_paths ut_varchar2_list,
a_reporter in out nocopy ut_reporter_base,
a_color_console integer,
a_coverage_schemes ut_varchar2_list,
a_source_file_mappings ut_file_mappings,
a_test_file_mappings ut_file_mappings,
a_include_objects ut_varchar2_list,
a_exclude_objects ut_varchar2_list,
a_client_character_set varchar2,
a_random_test_order integer,
a_random_test_order_seed positive,
a_tags varchar2 := null
) is
pragma autonomous_transaction;
begin
- 102
a_reporter := coalesce(a_reporter,ut_documentation_reporter());
- 102
ut_runner.run(
a_paths,
ut_reporters(a_reporter),
ut_utils.int_to_boolean(a_color_console),
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
gc_fail_on_errors,
a_client_character_set,
false,
ut_utils.int_to_boolean(a_random_test_order),
a_random_test_order_seed,
a_tags
);
- 101
rollback;
end;
procedure run_autonomous(
a_paths ut_varchar2_list,
a_reporter in out nocopy ut_reporter_base,
a_color_console integer,
a_coverage_schemes ut_varchar2_list,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list,
a_exclude_objects ut_varchar2_list,
a_client_character_set varchar2,
a_random_test_order integer,
a_random_test_order_seed positive,
a_tags varchar2 := null
) is
pragma autonomous_transaction;
begin
- 10
a_reporter := coalesce(a_reporter,ut_documentation_reporter());
- 10
ut_runner.run(
a_paths,
ut_reporters(a_reporter),
ut_utils.int_to_boolean(a_color_console),
a_coverage_schemes,
ut_file_mapper.build_file_mappings(a_source_files),
ut_file_mapper.build_file_mappings(a_test_files),
a_include_objects,
a_exclude_objects,
gc_fail_on_errors,
a_client_character_set,
false,
ut_utils.int_to_boolean(a_random_test_order),
a_random_test_order_seed,
a_tags
);
- 10
rollback;
end;
function get_report_outputs( a_cursor sys_refcursor ) return varchar2 is
l_clob clob;
l_item_type varchar2(32767);
l_result varchar2(4000);
begin
- 18750
if g_result_line_no is null then
- 16627
fetch a_cursor into l_clob, l_item_type;
- 16627
if a_cursor%notfound then
- 81
close a_cursor;
- 81
g_result_line_no := null;
- 81
g_result_lines := ut_varchar2_list();
- 81
raise_if_packages_invalidated();
- 80
raise no_data_found;
end if;
- 16546
g_result_lines := ut_utils.clob_to_table(l_clob, ut_utils.gc_max_storage_varchar2_len);
- 16546
g_result_line_no := g_result_lines.first;
end if;
- 18669
if g_result_line_no is not null then
- 18669
l_result := g_result_lines(g_result_line_no);
- 18669
g_result_line_no := g_result_lines.next(g_result_line_no);
end if;
- 18669
return l_result;
end;
function run(
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 3
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 3
run_autonomous(
ut_varchar2_list(),
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 3
if l_reporter is of (ut_output_reporter_base) then
- 3
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 90
loop
- 90
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
function run(
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 1
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 1
run_autonomous(
ut_varchar2_list(),
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_files,
a_test_files,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 1
if l_reporter is of (ut_output_reporter_base) then
- 1
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 30
loop
- 30
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
function run(
a_paths ut_varchar2_list,
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 6
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 6
run_autonomous(
a_paths,
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 6
if l_reporter is of (ut_output_reporter_base) then
- 6
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 158
loop
- 158
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
function run(
a_paths ut_varchar2_list,
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 1
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 1
run_autonomous(
a_paths,
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_files,
a_test_files,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 1
if l_reporter is of (ut_output_reporter_base) then
- 1
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 44
loop
- 44
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
function run(
a_path varchar2,
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 63
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 63
run_autonomous(
ut_varchar2_list(a_path),
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 62
if l_reporter is of (ut_output_reporter_base) then
- 62
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 18260
loop
- 18260
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
function run(
a_path varchar2,
a_reporter ut_reporter_base := null,
a_color_console integer := 0,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_random_test_order integer := 0,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) return ut_varchar2_rows pipelined is
- 8
l_reporter ut_reporter_base := a_reporter;
l_results sys_refcursor;
begin
- 8
run_autonomous(
ut_varchar2_list(a_path),
l_reporter,
a_color_console,
a_coverage_schemes,
a_source_files,
a_test_files,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
- 8
if l_reporter is of (ut_output_reporter_base) then
- 8
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
- 168
loop
- 168
pipe row( get_report_outputs( l_results ) );
end loop;
end if;
return;
end;
procedure run(
a_paths ut_varchar2_list,
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
- 32
l_reporter ut_reporter_base := a_reporter;
begin
- 32
if a_force_manual_rollback then
- 2
l_reporter := coalesce(l_reporter,ut_documentation_reporter());
- 2
ut_runner.run(
a_paths,
ut_reporters(l_reporter),
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
gc_fail_on_errors,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
else
- 30
run_autonomous(
a_paths,
l_reporter,
ut_utils.boolean_to_int(a_color_console),
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
ut_utils.boolean_to_int(a_random_test_order),
a_random_test_order_seed,
a_tags
);
end if;
- 32
if l_reporter is of (ut_output_reporter_base) then
- 32
treat(l_reporter as ut_output_reporter_base).lines_to_dbms_output();
end if;
- 32
raise_if_packages_invalidated();
end;
procedure run(
a_paths ut_varchar2_list,
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
- 4
l_reporter ut_reporter_base := a_reporter;
begin
- 4
ut.run(
a_paths,
l_reporter,
a_color_console,
a_coverage_schemes,
ut_file_mapper.build_file_mappings(a_source_files),
ut_file_mapper.build_file_mappings(a_test_files),
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
end;
procedure run(
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
begin
- 11
ut.run(
ut_varchar2_list(),
a_reporter,
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
end;
procedure run(
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
begin
ut.run(
ut_varchar2_list(),
a_reporter,
a_color_console,
a_coverage_schemes,
a_source_files,
a_test_files,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
end;
procedure run(
a_path varchar2,
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
begin
- 14
ut.run(
ut_varchar2_list(a_path),
a_reporter,
a_color_console,
a_coverage_schemes,
a_source_file_mappings,
a_test_file_mappings,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
end;
procedure run(
a_path varchar2,
a_reporter ut_reporter_base := null,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_files ut_varchar2_list,
a_test_files ut_varchar2_list,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
begin
- 3
ut.run(
ut_varchar2_list(a_path),
a_reporter,
a_color_console,
a_coverage_schemes,
a_source_files,
a_test_files,
a_include_objects,
a_exclude_objects,
a_client_character_set,
a_force_manual_rollback,
a_random_test_order,
a_random_test_order_seed,
a_tags
);
end;
procedure set_nls is
begin
- 4
if g_nls_date_format is null then
- 4
select nsp.value
into g_nls_date_format
from nls_session_parameters nsp
where parameter = 'NLS_DATE_FORMAT';
end if;
- 4
execute immediate 'alter session set nls_date_format = '''||ut_utils.gc_date_format||'''';
end;
procedure reset_nls is
begin
- 4
if g_nls_date_format is not null then
- 4
execute immediate 'alter session set nls_date_format = '''||g_nls_date_format||'''';
end if;
- 4
g_nls_date_format := null;
end;
end ut;
UT3.UT_RUNNER
93.5 % lines covered
123 relevant lines. 115 lines covered (including 1 lines partially covered ) and 8 lines missed
package body ut_runner is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
/**
* Private functions
*/
function to_ut_object_list(a_names ut_varchar2_list, a_schema_names ut_varchar2_rows) return ut_object_names is
l_result ut_object_names;
l_object_name ut_object_name;
begin
- 116
if a_names is not empty then
- 3
l_result := ut_object_names();
- 6
for i in 1 .. a_names.count loop
- 3
l_object_name := ut_object_name(a_names(i));
- 3
if l_object_name.owner is null then
for i in 1 .. cardinality(a_schema_names) loop
l_result.extend;
l_result(l_result.last) := ut_object_name(a_schema_names(i)||'.'||l_object_name.name);
end loop;
else
- 3
l_result.extend;
- 3
l_result(l_result.last) := l_object_name;
end if;
end loop;
end if;
- 116
return l_result;
end;
procedure finish_run(a_run ut_run, a_force_manual_rollback boolean) is
begin
- 116
ut_event_manager.trigger_event(ut_event_manager.gc_finalize, a_run);
- 117
ut_metadata.reset_source_definition_cache;
- 116
ut_utils.read_cache_to_dbms_output();
- 222
ut_coverage_helper.cleanup_tmp_table();
- 232
ut_compound_data_helper.cleanup_diff();
- 116
if not a_force_manual_rollback then
- 114
rollback;
- 114
ut_utils.cleanup_session_temp_tables;
end if;
end;
/**
* Public functions
*/
function version return varchar2 is
begin
- 118
return ut_utils.gc_version;
end;
function version_compatibility_check( a_requested varchar2, a_current varchar2 := null ) return integer is
- 16
l_result boolean := false;
- 16
l_requested ut_utils.t_version := ut_utils.to_version(a_requested);
- 15
l_current ut_utils.t_version := ut_utils.to_version(coalesce(a_current,version()));
begin
- 14
if l_requested.major = l_current.major
- 1
and (l_requested.minor < l_current.minor or l_requested.minor is null
- 1
or l_requested.minor = l_current.minor and (l_requested.bugfix <= l_current.bugfix or l_requested.bugfix is null)) then
- 10
l_result := true;
end if;
- 14
return ut_utils.boolean_to_int(l_result);
end;
procedure run(
a_paths ut_varchar2_list,
a_reporters ut_reporters,
a_color_console boolean := false,
a_coverage_schemes ut_varchar2_list := null,
a_source_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_include_objects ut_varchar2_list := null,
a_exclude_objects ut_varchar2_list := null,
a_fail_on_errors boolean := false,
a_client_character_set varchar2 := null,
a_force_manual_rollback boolean := false,
a_random_test_order boolean := false,
a_random_test_order_seed positive := null,
a_tags varchar2 := null
) is
l_run ut_run;
l_coverage_schema_names ut_varchar2_rows;
- 116
l_exclude_object_names ut_object_names := ut_object_names();
l_include_object_names ut_object_names;
- 116
l_paths ut_varchar2_list := ut_varchar2_list();
l_random_test_order_seed positive;
- 116
l_tags ut_varchar2_rows := ut_varchar2_rows();
begin
- 232
ut_event_manager.initialize();
- 116
if a_reporters is not empty then
- 232
for i in 1 .. a_reporters.count loop
- 116
ut_event_manager.add_listener( a_reporters(i) );
end loop;
else
ut_event_manager.add_listener( ut_documentation_reporter() );
end if;
- 116
ut_event_manager.add_listener( ut_session_info() );
- 116
ut_event_manager.trigger_event(ut_event_manager.gc_initialize);
- 116
ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_run_info());
- 116
if a_random_test_order_seed is not null then
- 4
l_random_test_order_seed := a_random_test_order_seed;
- 112
elsif a_random_test_order then
dbms_random.seed( to_char(systimestamp,'yyyyddmmhh24missffff') );
l_random_test_order_seed := trunc(dbms_random.value(1, 1000000000));
end if;
- 116
if a_paths is null or a_paths is empty or a_paths.count = 1 and a_paths(1) is null then
- 21
l_paths := ut_varchar2_list(sys_context('userenv', 'current_schema'));
else
- 196
for i in 1..a_paths.count loop
- 101
l_paths := l_paths multiset union ut_utils.string_to_table(a_string => a_paths(i),a_delimiter => ',');
end loop;
end if;
begin
- 232
ut_expectation_processor.reset_invalidation_exception();
- 116
ut_utils.save_dbms_output_to_cache();
- 116
ut_console_reporter_base.set_color_enabled(a_color_console);
- 116
if a_coverage_schemes is not empty then
- 1
l_coverage_schema_names := ut_utils.convert_collection(a_coverage_schemes);
else
- 115
l_coverage_schema_names := ut_suite_manager.get_schema_names(l_paths);
end if;
- 116
if a_exclude_objects is not empty then
l_exclude_object_names := to_ut_object_list(a_exclude_objects, l_coverage_schema_names);
end if;
- 116
if a_tags is not null then
- 16
l_tags := l_tags multiset union distinct ut_utils.convert_collection(
ut_utils.trim_list_elements(ut_utils.filter_list(ut_utils.string_to_table(a_tags,','),ut_utils.gc_word_no_space))
);
end if;
- 116
l_exclude_object_names := l_exclude_object_names multiset union all ut_suite_manager.get_schema_ut_packages(l_coverage_schema_names);
- 116
l_include_object_names := to_ut_object_list(a_include_objects, l_coverage_schema_names);
- 116
l_run := ut_run(
null,
l_paths,
l_coverage_schema_names,
l_exclude_object_names,
l_include_object_names,
set(a_source_file_mappings),
set(a_test_file_mappings),
a_client_character_set,
l_random_test_order_seed,
l_tags
);
- 116
ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags);
- 115
if a_force_manual_rollback then
- 2
l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true );
end if;
- 115
l_run.do_execute();
- 115
finish_run(l_run, a_force_manual_rollback);
exception
- 2
when others then
- 1
finish_run(l_run, a_force_manual_rollback);
- 1
dbms_output.put_line(dbms_utility.format_error_backtrace);
- 1
dbms_output.put_line(dbms_utility.format_error_stack);
- 1
raise;
end;
- 1/2 115
if a_fail_on_errors and l_run.result in (ut_utils.gc_failure, ut_utils.gc_error) then
- 1
raise_application_error(ut_utils.gc_some_tests_failed, 'Some tests failed');
end if;
end;
procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2 := null) is
begin
- 2
ut_annotation_manager.rebuild_annotation_cache(a_object_owner, coalesce(a_object_type,'PACKAGE'));
end;
procedure purge_cache(a_object_owner varchar2 := null, a_object_type varchar2 := null) is
begin
- 1
ut_annotation_manager.purge_cache(a_object_owner, a_object_type);
end;
function get_suites_info(a_owner varchar2 := null, a_package_name varchar2 := null) return ut_suite_items_info pipelined is
l_cursor sys_refcursor;
l_results ut_suite_items_info;
- 3
c_bulk_limit constant integer := 100;
begin
- 3
l_cursor := ut_suite_manager.get_suites_info( nvl(a_owner,sys_context('userenv', 'current_schema')), a_package_name );
- 3
loop
- 3
fetch l_cursor bulk collect into l_results limit c_bulk_limit;
- 13
for i in 1 .. l_results.count loop
- 10
pipe row (l_results(i));
end loop;
- 3
exit when l_cursor%notfound;
end loop;
- 3
close l_cursor;
- 3
return;
end;
function is_test(a_owner varchar2, a_package_name varchar2, a_procedure_name varchar2) return boolean is
- 7
l_result boolean := false;
begin
- 7
if a_owner is not null and a_package_name is not null and a_procedure_name is not null then
- 4
l_result := ut_suite_manager.suite_item_exists( a_owner, a_package_name, a_procedure_name );
end if;
- 7
return l_result;
end;
function is_suite(a_owner varchar2, a_package_name varchar2) return boolean is
- 6
l_result boolean := false;
begin
- 6
if a_owner is not null and a_package_name is not null then
- 4
l_result := ut_suite_manager.suite_item_exists( a_owner, a_package_name );
end if;
- 6
return l_result;
end;
function has_suites(a_owner varchar2) return boolean is
- 5
l_result boolean := false;
begin
- 5
if a_owner is not null then
- 4
l_result := ut_suite_manager.suite_item_exists( a_owner );
end if;
- 5
return l_result;
end;
function get_reporters_list return tt_reporters_info pipelined is
- 1
l_owner varchar2(128) := upper(ut_utils.ut_owner());
l_reporters ut_reporters_info;
l_result t_reporter_rec;
begin
- 4
loop
- 4
l_reporters := ut_utils.get_child_reporters( l_reporters );
- 4
exit when l_reporters is null or l_reporters.count = 0;
- 18
for i in 1 .. l_reporters.count loop
- 15
if l_reporters(i).is_instantiable = 'Y' then
- 12
l_result.reporter_object_name := l_owner||'.'||l_reporters(i).object_name;
- 12
l_result.is_output_reporter := l_reporters(i).is_output_reporter;
- 12
pipe row( l_result );
end if;
end loop;
end loop;
end;
function hash_suite_path(a_path varchar2, a_random_seed positiven) return varchar2 is
- 16
l_start_pos pls_integer := 1;
- 16
l_end_pos pls_integer := 1;
l_result varchar2(4000);
l_item varchar2(4000);
- 16
l_at_end boolean := false;
begin
- 16
if a_random_seed is null then
l_result := a_path;
end if;
- 16
if a_path is not null then
- 36
loop
- 36
l_end_pos := instr(a_path,'.',l_start_pos);
- 36
if l_end_pos = 0 then
- 16
l_end_pos := length(a_path)+1;
- 16
l_at_end := true;
end if;
- 36
l_item := substr(a_path,l_start_pos,l_end_pos-l_start_pos);
- 36
if l_item is not null then
- 36
l_result :=
l_result ||
ut_utils.get_hash( to_char( dbms_utility.get_hash_value( l_item, 1, a_random_seed ) ) );
end if;
- 36
exit when l_at_end;
- 20
l_result := l_result || chr(0);
- 20
l_start_pos := l_end_pos + 1;
end loop;
end if;
- 16
return l_result;
end;
end ut_runner;
UT3.UT_SUITE_ITEM_INFO
100 % lines covered
12 relevant lines. 12 lines covered and 0 lines missed
type body ut_suite_item_info is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_suite_item_info(a_object_owner varchar2, a_object_name varchar2, a_item_name varchar2,
a_item_description varchar2, a_item_type varchar2, a_item_line_no integer, a_path varchar2, a_disabled_flag integer,
a_tags ut_varchar2_rows) return self as result is
begin
- 10
self.object_owner := a_object_owner;
- 10
self.object_name := a_object_name;
- 10
self.item_name := a_item_name;
- 10
self.item_description := a_item_description;
- 10
self.item_type := a_item_type;
- 10
self.item_line_no := a_item_line_no;
- 10
self.path := a_path;
- 10
self.disabled_flag := a_disabled_flag;
- 10
self.tags := case
- 1
when a_tags is null then null
- 1
when a_tags.count = 0 then null
else ut_utils.to_string(ut_utils.table_to_clob(a_tags,',') ,a_quote_char => null)
end;
- 10
return;
end;
end;
UT3.UT_ANNOTATION_CACHE_MANAGER
95.12 % lines covered
41 relevant lines. 39 lines covered and 2 lines missed
package body ut_annotation_cache_manager as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
procedure update_cache(a_object ut_annotated_object) is
l_cache_id integer;
- 415
l_timestamp timestamp := systimestamp;
pragma autonomous_transaction;
begin
- 415
update ut_annotation_cache_schema s
set s.max_parse_time = l_timestamp
where s.object_type = a_object.object_type and s.object_owner = a_object.object_owner;
- 415
if sql%rowcount = 0 then
- 5
insert into ut_annotation_cache_schema s
(object_owner, object_type, max_parse_time)
values (a_object.object_owner, a_object.object_type, l_timestamp);
end if;
-- if not in trigger, or object has annotations
- 415
if ora_sysevent is null or a_object.annotations is not null and a_object.annotations.count > 0 then
- 376
update ut_annotation_cache_info i
set i.parse_time = l_timestamp,
i.is_annotated = case when a_object.annotations is not empty then 'Y' else 'N' end
where (i.object_owner, i.object_name, i.object_type)
in ((a_object.object_owner, a_object.object_name, a_object.object_type))
returning cache_id into l_cache_id;
- 376
if sql%rowcount = 0 then
- 85
insert into ut_annotation_cache_info
(cache_id, object_owner, object_name, object_type, parse_time, is_annotated)
values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, l_timestamp,
case when a_object.annotations is not empty then 'Y' else 'N' end
)
returning cache_id into l_cache_id;
end if;
end if;
- 415
delete from ut_annotation_cache c where cache_id = l_cache_id;
- 415
if a_object.annotations is not null and a_object.annotations.count > 0 then
- 376
insert into ut_annotation_cache
(cache_id, annotation_position, annotation_name, annotation_text, subobject_name)
select l_cache_id, a.position, a.name, a.text, a.subobject_name
from table(a_object.annotations) a;
end if;
- 415
commit;
end;
procedure reset_objects_cache(a_objects ut_annotation_objs_cache_info) is
- 85
l_timestamp timestamp := systimestamp;
pragma autonomous_transaction;
begin
- 85
delete from ut_annotation_cache c
where c.cache_id
in (select i.cache_id
from ut_annotation_cache_info i
join table (a_objects) o
on o.object_name = i.object_name
and o.object_type = i.object_type
and o.object_owner = i.object_owner
);
- 85
update ut_annotation_cache_schema s
set s.max_parse_time = l_timestamp
where (s.object_owner, s.object_type)
in (
select o.object_owner, o.object_type
from table(a_objects) o
);
- 85
if sql%rowcount = 0 then
- 1
insert into ut_annotation_cache_schema s
(object_owner, object_type, max_parse_time)
select distinct o.object_owner, o.object_type, l_timestamp
from table(a_objects) o;
end if;
- 85
merge into ut_annotation_cache_info i
using (select o.object_name, o.object_type, o.object_owner
from table(a_objects) o ) o
on (o.object_name = i.object_name
and o.object_type = i.object_type
and o.object_owner = i.object_owner)
when matched then
update
set parse_time = l_timestamp,
is_annotated = 'N'
when not matched then insert
(cache_id, object_owner, object_name, object_type, parse_time, is_annotated)
values (ut_annotation_cache_seq.nextval, o.object_owner, o.object_name, o.object_type, l_timestamp, 'N');
- 85
commit;
end;
function get_cached_objects_list(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp := null) return ut_annotation_objs_cache_info is
l_result ut_annotation_objs_cache_info;
begin
- 893
select ut_annotation_obj_cache_info(
object_owner => i.object_owner,
object_name => i.object_name,
object_type => i.object_type,
needs_refresh => 'N',
parse_time => i.parse_time
)
bulk collect into l_result
from ut_annotation_cache_info i
where i.object_owner = a_object_owner
and i.object_type = a_object_type
and (i.parse_time > a_parsed_after or a_parsed_after is null);
- 893
return l_result;
end;
function get_cache_schema_info(a_object_owner varchar2, a_object_type varchar2) return t_cache_schema_info is
l_result t_cache_schema_info;
begin
begin
- 327
select *
into l_result
from ut_annotation_cache_schema s
where s.object_type = a_object_type and s.object_owner = a_object_owner;
exception
- 6
when no_data_found then
- 3
null;
end;
- 327
return l_result;
end;
procedure set_fully_refreshed(a_object_owner varchar2, a_object_type varchar2) is
pragma autonomous_transaction;
begin
- 13
update ut_annotation_cache_schema s
set s.full_refresh_time = s.max_parse_time
where s.object_owner = a_object_owner
and s.object_type = a_object_type;
- 13
commit;
end;
procedure remove_from_cache(a_objects ut_annotation_objs_cache_info) is
pragma autonomous_transaction;
begin
- 388
delete from ut_annotation_cache_info i
where exists (
select 1 from table (a_objects) o
where o.object_name = i.object_name
and o.object_type = i.object_type
and o.object_owner = i.object_owner
);
- 388
commit;
end;
function get_annotations_parsed_since(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp) return sys_refcursor is
l_results sys_refcursor;
begin
- 317
open l_results for
select ut_annotated_object(
i.object_owner, i.object_name, i.object_type, i.parse_time,
cast(
collect(
ut_annotation(
c.annotation_position, c.annotation_name, c.annotation_text, c.subobject_name
) order by c.annotation_position
) as ut_annotations
)
) as annotated_object
from ut_annotation_cache_info i
join ut_annotation_cache c on i.cache_id = c.cache_id
where i.object_owner = a_object_owner and i.object_type = a_object_type
and (i.parse_time > a_parsed_after or a_parsed_after is null)
group by i.object_owner, i.object_type, i.object_name, i.parse_time;
- 317
return l_results;
end;
procedure purge_cache(a_object_owner varchar2, a_object_type varchar2) is
l_filter varchar2(32767);
l_cache_filter varchar2(32767);
pragma autonomous_transaction;
begin
- 2
if a_object_owner is null and a_object_type is null then
l_filter := ':a_object_owner is null and :a_object_type is null';
l_cache_filter := l_filter;
else
- 2
l_filter := case when a_object_owner is null then ':a_object_owner is null' else 'object_owner = :a_object_owner' end;
- 2
l_filter := l_filter || ' and ' || case when a_object_type is null then ':a_object_type is null' else 'object_type = :a_object_type' end;
- 2
l_cache_filter := ' c.cache_id in (select i.cache_id from ut_annotation_cache_info i where ' || l_filter || ' )';
end if;
- 2
execute immediate 'delete from ut_annotation_cache c where ' || l_cache_filter
using a_object_owner, a_object_type;
- 2
execute immediate ' delete from ut_annotation_cache_info i where ' || l_filter
using a_object_owner, a_object_type;
- 2
execute immediate ' delete from ut_annotation_cache_schema s where ' || l_filter
using a_object_owner, a_object_type;
- 2
commit;
end;
end;
UT3.UT_ANNOTATION_MANAGER
98.86 % lines covered
88 relevant lines. 87 lines covered and 1 lines missed
package body ut_annotation_manager as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
------------------------------
--private definitions
function user_can_see_whole_schema( a_schema_name varchar2 ) return boolean is
begin
- 345
return sys_context('userenv','current_schema') = a_schema_name
- 1
or ut_metadata.user_has_execute_any_proc()
- 1
or ut_metadata.is_object_visible('dba_objects');
end;
function get_non_existing_objects( a_object_owner varchar2, a_object_type varchar2 ) return ut_annotation_objs_cache_info is
- 265
l_objects_view varchar2(200) := ut_metadata.get_objects_view_name();
- 265
l_object_to_delete ut_annotation_objs_cache_info := ut_annotation_objs_cache_info();
l_cached_objects ut_annotation_objs_cache_info;
begin
- 265
l_cached_objects := ut_annotation_cache_manager.get_cached_objects_list( a_object_owner, a_object_type );
- 265
if l_cached_objects is not empty then
- 262
execute immediate 'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_cached_objects))||') */
value(i)
from table( :l_data ) i
where
not exists (
select 1 from '||l_objects_view||q'[ o
where o.owner = i.object_owner
and o.object_name = i.object_name
and o.object_type = i.object_type
and o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
)]'
bulk collect into l_object_to_delete
using l_cached_objects;
end if;
- 265
return l_object_to_delete;
end;
function get_objects_to_refresh(
a_object_owner varchar2,
a_object_type varchar2,
a_modified_after timestamp
) return ut_annotation_objs_cache_info is
- 327
l_ut_owner varchar2(250) := ut_utils.ut_owner;
l_refresh_needed boolean;
- 327
l_objects_view varchar2(200) := ut_metadata.get_objects_view_name();
l_cached_objects ut_annotation_objs_cache_info;
l_result ut_annotation_objs_cache_info;
begin
- 327
ut_event_manager.trigger_event( 'get_objects_to_refresh - start' );
- 327
l_refresh_needed := ( ut_trigger_check.is_alive() = false ) or a_modified_after is null;
- 327
l_cached_objects := ut_annotation_cache_manager.get_cached_objects_list( a_object_owner, a_object_type, a_modified_after );
- 327
if l_refresh_needed then
--limit the list to objects that exist and are visible to the invoking user
--enrich the list by info about cache validity
- 29
execute immediate
'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_cached_objects))||') */
'||l_ut_owner||q'[.ut_annotation_obj_cache_info(
object_owner => o.owner,
object_name => o.object_name,
object_type => o.object_type,
needs_refresh => 'Y',
parse_time => c.parse_time
)
from ]'||l_objects_view||' o
left join table( cast(:l_cached_objects as '||l_ut_owner||q'[.ut_annotation_objs_cache_info ) ) c
on o.owner = c.object_owner
and o.object_name = c.object_name
and o.object_type = c.object_type
where o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
and case when o.last_ddl_time < cast(c.parse_time as date) then 'N' else 'Y' end = 'Y'
and ]'
- 1
|| case
- 1
when a_modified_after is null
then ':a_modified_after is null'
else 'o.last_ddl_time >= cast(:a_modified_after as date)'
end
bulk collect into l_result using l_cached_objects, a_modified_after;
else
- 298
l_result := l_cached_objects;
end if;
- 327
ut_event_manager.trigger_event('get_objects_to_refresh - end (count='||l_result.count||')');
- 327
return l_result;
end;
function get_sources_to_annotate(a_object_owner varchar2, a_object_type varchar2, a_objects_to_refresh ut_annotation_objs_cache_info) return sys_refcursor is
l_result sys_refcursor;
- 85
l_sources_view varchar2(200) := ut_metadata.get_source_view_name();
l_card natural;
begin
- 85
l_card := ut_utils.scale_cardinality(cardinality(a_objects_to_refresh));
- 85
open l_result for
q'[select x.name, x.text
from (select /*+ cardinality( r ]'||l_card||q'[ )*/
s.name, s.text, s.line,
max(case when s.text like '%--%\%%' escape '\'
and regexp_like(s.text,'^\s*--\s*%')
then 'Y' else 'N' end
)
over(partition by s.name) is_annotated
from table(:a_objects_to_refresh) r
join ]'||l_sources_view||q'[ s
on s.name = r.object_name
and s.owner = r.object_owner
and s.type = r.object_type
where s.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
and s.type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
) x
where x.is_annotated = 'Y'
order by x.name, x.line]'
using a_objects_to_refresh;
- 85
return l_result;
end;
procedure build_annot_cache_for_sources(
a_object_owner varchar2,
a_object_type varchar2,
a_sources_cursor sys_refcursor
) is
l_annotations ut_annotations;
- 216
c_lines_fetch_limit constant integer := 10000;
l_lines dbms_preprocessor.source_lines_t;
l_names dbms_preprocessor.source_lines_t;
l_name varchar2(250);
l_object_lines dbms_preprocessor.source_lines_t;
- 216
l_parse_time date := sysdate;
pragma autonomous_transaction;
begin
- 216
loop
- 216
fetch a_sources_cursor bulk collect into l_names, l_lines limit c_lines_fetch_limit;
- 16196
for i in 1 .. l_names.count loop
- 15980
if l_names(i) != l_name then
- 211
l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type);
- 211
ut_annotation_cache_manager.update_cache(
ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations)
);
- 211
l_object_lines.delete;
end if;
- 15980
l_name := l_names(i);
- 15980
l_object_lines(l_object_lines.count+1) := l_lines(i);
end loop;
- 216
exit when a_sources_cursor%notfound;
end loop;
- 216
if a_sources_cursor%rowcount > 0 then
- 204
l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type);
- 204
ut_annotation_cache_manager.update_cache(
ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations)
);
- 204
l_object_lines.delete;
end if;
- 216
close a_sources_cursor;
end;
procedure validate_annotation_cache(
a_object_owner varchar2,
a_object_type varchar2,
a_modified_after timestamp := null
) is
l_objects_to_refresh ut_annotation_objs_cache_info;
- 327
l_modified_after timestamp := a_modified_after;
begin
- 327
if ut_annotation_cache_manager.get_cache_schema_info(a_object_owner, a_object_type).full_refresh_time is null then
- 10
l_modified_after := null;
end if;
- 327
l_objects_to_refresh := get_objects_to_refresh(a_object_owner, a_object_type, l_modified_after);
- 327
ut_event_manager.trigger_event('validate_annotation_cache - start (l_objects_to_refresh.count = '||l_objects_to_refresh.count||')');
- 327
if user_can_see_whole_schema( a_object_owner ) then
--Remove non existing objects from cache only when user can see whole schema
- 265
ut_annotation_cache_manager.remove_from_cache( get_non_existing_objects( a_object_owner, a_object_type ) );
end if;
--if some source needs parsing and putting into cache
- 327
if l_objects_to_refresh.count > 0 then
--Delete annotations for objects that are to be refreshed
- 85
ut_annotation_cache_manager.reset_objects_cache(l_objects_to_refresh);
--Rebuild cache from objects source
- 85
build_annot_cache_for_sources(
a_object_owner, a_object_type,
get_sources_to_annotate(a_object_owner, a_object_type, l_objects_to_refresh)
);
end if;
- 327
if l_modified_after is null then
- 18
if user_can_see_whole_schema( a_object_owner ) then
- 13
ut_annotation_cache_manager.set_fully_refreshed( a_object_owner, a_object_type );
else
-- if user cannot see full schema - we dont mark it as fully refreshed
-- it will get refreshed each time until someone with proper privs will refresh it
- 5
null;
end if;
end if;
- 327
ut_event_manager.trigger_event('validate_annotation_cache - end');
end;
------------------------------------------------------------
--public definitions
------------------------------------------------------------
procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2) is
begin
- 10
validate_annotation_cache( a_object_owner, a_object_type );
end;
procedure trigger_obj_annotation_rebuild is
l_sql_text ora_name_list_t;
l_parts binary_integer;
l_restricted_users ora_name_list_t;
function get_source_from_sql_text(a_object_name varchar2, a_sql_text ora_name_list_t, a_parts binary_integer) return sys_refcursor is
l_sql_clob clob;
- 128
l_sql_lines ut_varchar2_rows := ut_varchar2_rows();
l_result sys_refcursor;
begin
- 128
if a_parts > 0 then
- 747
for i in 1..a_parts loop
- 619
ut_utils.append_to_clob(l_sql_clob, a_sql_text(i));
end loop;
- 128
l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob);
-- replace comment lines that contain "-- create or replace"
- 128
l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modifier => 'mi');
-- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing
-- needed for dbms_preprocessor
- 128
l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni');
- 128
l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) );
end if;
- 128
open l_result for
select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines);
- 128
return l_result;
end;
function get_source_for_object(a_object_owner varchar2, a_object_name varchar2, a_object_type varchar2) return sys_refcursor is
l_result sys_refcursor;
- 3
l_sources_view varchar2(200) := ut_metadata.get_source_view_name();
begin
- 3
open l_result for
q'[select :a_object_name, s.text
from ]'||l_sources_view||q'[ s
where s.type = :a_object_type
and s.owner = :a_object_owner
and s.name = :a_object_name
order by s.line]'
using a_object_name, a_object_type, a_object_owner, a_object_name;
- 3
return l_result;
end;
begin
- 254
if ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') then
$if dbms_db_version.version < 12 $then
l_restricted_users := ora_name_list_t(
'ANONYMOUS','APPQOSSYS','AUDSYS','DBSFWUSER','DBSNMP','DIP','GGSYS','GSMADMIN_INTERNAL',
'GSMCATUSER','GSMUSER','ORACLE_OCM','OUTLN','REMOTE_SCHEDULER_AGENT','SYS','SYS$UMF',
'SYSBACKUP','SYSDG','SYSKM','SYSRAC','SYSTEM','WMSYS','XDB','XS$NULL');
$else
- 254
select username bulk collect into l_restricted_users
from all_users where oracle_maintained = 'Y';
$end
- 254
if ora_dict_obj_owner member of l_restricted_users then
return;
end if;
- 254
if ora_sysevent = 'CREATE' then
- 128
l_parts := ORA_SQL_TXT(l_sql_text);
- 128
build_annot_cache_for_sources(
ora_dict_obj_owner, ora_dict_obj_type,
get_source_from_sql_text(ora_dict_obj_name, l_sql_text, l_parts)
);
- 126
elsif ora_sysevent = 'ALTER' then
- 3
build_annot_cache_for_sources(
ora_dict_obj_owner, ora_dict_obj_type,
get_source_for_object(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type)
);
- 123
elsif ora_sysevent = 'DROP' then
- 123
ut_annotation_cache_manager.remove_from_cache(
ut_annotation_objs_cache_info(
ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y', null)
)
);
end if;
end if;
end;
function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_modified_after timestamp) return sys_refcursor is
l_cursor sys_refcursor;
begin
- 317
ut_event_manager.trigger_event('get_annotated_objects - start: a_modified_after='||ut_utils.to_string(a_modified_after));
- 317
validate_annotation_cache(a_object_owner, a_object_type, a_modified_after);
--pipe annotations from cache
- 317
l_cursor := ut_annotation_cache_manager.get_annotations_parsed_since(a_object_owner, a_object_type, a_modified_after);
- 317
ut_event_manager.trigger_event('get_annotated_objects - end');
- 317
return l_cursor;
end;
procedure purge_cache(a_object_owner varchar2, a_object_type varchar2) is
begin
- 2
ut_annotation_cache_manager.purge_cache(a_object_owner, a_object_type);
end;
end;
UT3.UT_ANNOTATION_PARSER
97.26 % lines covered
73 relevant lines. 71 lines covered and 2 lines missed
package body ut_annotation_parser as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
------------------------------
--private definitions
type tt_comment_list is table of varchar2(32767) index by binary_integer;
- 1
gc_annotation_qualifier constant varchar2(1) := '%';
- 1
gc_annot_comment_pattern constant varchar2(30) := '^( |'||chr(09)||')*-- *('||gc_annotation_qualifier||'.*?)$'; -- chr(09) is a tab character
- 1
gc_comment_replacer_patter constant varchar2(50) := '{COMMENT#%N%}';
- 1
gc_comment_replacer_regex_ptrn constant varchar2(25) := '{COMMENT#(\d+)}';
- 1
gc_regexp_identifier constant varchar2(50) := '[a-zA-Z][a-zA-Z0-9#_$]*';
- 1
gc_annotation_block_pattern constant varchar2(200) := '(({COMMENT#.+}'||chr(10)||')+)( |'||chr(09)||')*(procedure|function)\s+(' ||
gc_regexp_identifier || ')';
- 1
gc_annotation_pattern constant varchar2(50) := gc_annotation_qualifier || gc_regexp_identifier || '[ '||chr(9)||']*(\(.*?\)\s*?$)?';
procedure add_annotation(
a_annotations in out nocopy ut_annotations,
a_position positiven,
a_comment varchar2,
a_subobject_name varchar2 := null
) is
l_annotation_str varchar2(32767);
l_annotation_text varchar2(32767);
l_annotation_name varchar2(1000);
begin
-- strip everything except the annotation itself (spaces and others)
- 6031
l_annotation_str := regexp_substr(a_comment, gc_annotation_pattern, 1, 1, modifier => 'i');
- 6031
if l_annotation_str is not null then
-- get the annotation name and it's parameters if present
- 6031
l_annotation_name := lower(regexp_substr(l_annotation_str ,'%(' || gc_regexp_identifier || ')', subexpression => 1));
- 6031
l_annotation_text := trim(regexp_substr(l_annotation_str, '\((.*?)\)\s*$', subexpression => 1));
- 6031
a_annotations.extend;
- 6031
a_annotations( a_annotations.last) :=
ut_annotation(a_position, l_annotation_name, l_annotation_text, a_subobject_name);
end if;
end;
procedure delete_processed_comments( a_comments in out nocopy tt_comment_list, a_annotations ut_annotations ) is
- 429
l_loop_index binary_integer := 1;
begin
- 429
l_loop_index := a_annotations.first;
- 4929
while l_loop_index is not null loop
- 4500
a_comments.delete( a_annotations(l_loop_index).position );
- 4500
l_loop_index := a_annotations.next( l_loop_index );
end loop;
end;
procedure add_annotations(
a_annotations in out nocopy ut_annotations,
a_source varchar2,
a_comments tt_comment_list,
a_subobject_name varchar2 := null
) is
- 3705
l_loop_index binary_integer := 1;
l_annotation_index binary_integer;
begin
-- loop while there are unprocessed comment blocks
- 8205
while 0 != nvl(regexp_instr(srcstr => a_source
,pattern => gc_comment_replacer_regex_ptrn
,occurrence => l_loop_index
,subexpression => 1)
,0) loop
-- define index of the comment block and get it's content from cache
- 4500
l_annotation_index := regexp_substr( a_source ,gc_comment_replacer_regex_ptrn ,1 ,l_loop_index ,subexpression => 1);
- 4500
add_annotation( a_annotations, l_annotation_index, a_comments( l_annotation_index ), a_subobject_name );
- 4500
l_loop_index := l_loop_index + 1;
end loop;
end add_annotations;
procedure add_procedure_annotations(a_annotations in out nocopy ut_annotations, a_source clob, a_comments in out nocopy tt_comment_list) is
l_proc_comments varchar2(32767);
l_proc_name varchar2(250);
l_annot_proc_ind number;
l_annot_proc_block varchar2(32767);
begin
-- loop through procedures and functions of the package and get all the comment blocks just before it's declaration
- 429
l_annot_proc_ind := 1;
- 4134
loop
--find annotated procedure index
- 4134
l_annot_proc_ind := regexp_instr(srcstr => a_source
,pattern => gc_annotation_block_pattern
,occurrence => 1
,modifier => 'i'
,position => l_annot_proc_ind);
- 4134
exit when l_annot_proc_ind = 0;
--get the annotations with procedure name
- 3705
l_annot_proc_block := regexp_substr(srcstr => a_source
,pattern => gc_annotation_block_pattern
,position => l_annot_proc_ind
,occurrence => 1
,modifier => 'i');
--extract the annotations
- 3705
l_proc_comments := trim(regexp_substr(srcstr => l_annot_proc_block
,pattern => gc_annotation_block_pattern
,modifier => 'i'
,subexpression => 1));
--extract the procedure name
- 3705
l_proc_name := trim(regexp_substr(srcstr => l_annot_proc_block
,pattern => gc_annotation_block_pattern
,modifier => 'i'
,subexpression => 5));
-- parse the comment block for the syntactically correct annotations and store them as an array
- 3705
add_annotations(a_annotations, l_proc_comments, a_comments, l_proc_name);
- 3705
l_annot_proc_ind := instr(a_source, ';', l_annot_proc_ind + length(l_annot_proc_block) );
end loop;
end add_procedure_annotations;
function extract_and_replace_comments(a_source in out nocopy clob) return tt_comment_list is
l_comments tt_comment_list;
l_comment_pos binary_integer;
l_comment_line binary_integer;
l_comment_replacer varchar2(50);
- 429
l_source clob := a_source;
begin
- 429
l_comment_pos := 1;
- 6460
loop
- 6460
l_comment_pos := regexp_instr(srcstr => a_source
,pattern => gc_annot_comment_pattern
,occurrence => 1
,modifier => 'm'
,position => l_comment_pos);
- 6460
exit when l_comment_pos = 0;
-- position index is shifted by 1 because gc_annot_comment_pattern contains ^ as first sign
-- but after instr index already points to the char on that line
- 6031
l_comment_pos := l_comment_pos-1;
- 6031
l_comment_line := length(substr(a_source,1,l_comment_pos))-length(replace(substr(a_source,1,l_comment_pos),chr(10)))+1;
- 6031
l_comments(l_comment_line) := trim(regexp_substr(srcstr => a_source
,pattern => gc_annot_comment_pattern
,occurrence => 1
,position => l_comment_pos
,modifier => 'm'
,subexpression => 2));
- 6031
l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line);
- 6031
l_source := regexp_replace(srcstr => a_source
,pattern => gc_annot_comment_pattern
,replacestr => l_comment_replacer
,position => l_comment_pos
,occurrence => 1
,modifier => 'm');
- 6031
dbms_lob.freetemporary(a_source);
- 6031
a_source := l_source;
- 6031
dbms_lob.freetemporary(l_source);
- 6031
l_comment_pos := l_comment_pos + length(l_comment_replacer);
end loop;
- 429
ut_utils.debug_log(a_source);
- 429
return l_comments;
end extract_and_replace_comments;
------------------------------------------------------------
--public definitions
------------------------------------------------------------
function parse_object_annotations(a_source clob) return ut_annotations is
- 429
l_source clob := a_source;
l_comments tt_comment_list;
- 429
l_annotations ut_annotations := ut_annotations();
l_result ut_annotations;
l_comment_index positive;
begin
- 429
l_source := ut_utils.replace_multiline_comments(l_source);
-- replace all single line comments with {COMMENT#12} element and store it's content for easier processing
-- this call modifies l_source
- 429
l_comments := extract_and_replace_comments(l_source);
- 429
add_procedure_annotations(l_annotations, l_source, l_comments);
- 429
delete_processed_comments(l_comments, l_annotations);
--at this point, only the comments not related to procedures are left, so we process them all as top-level
- 429
l_comment_index := l_comments.first;
- 1960
while l_comment_index is not null loop
- 1531
add_annotation( l_annotations, l_comment_index, l_comments( l_comment_index ) );
- 1531
l_comment_index := l_comments.next(l_comment_index);
end loop;
- 429
dbms_lob.freetemporary(l_source);
- 429
select value(x) bulk collect into l_result from table(l_annotations) x order by x.position;
- 429
return l_result;
end parse_object_annotations;
function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t, a_object_type varchar2) return ut_annotations is
l_processed_lines dbms_preprocessor.source_lines_t;
l_source clob;
- 416
l_annotations ut_annotations := ut_annotations();
ex_package_is_wrapped exception;
pragma exception_init(ex_package_is_wrapped, -24241);
source_text_is_empty exception;
pragma exception_init(source_text_is_empty, -24236);
begin
- 416
if a_source_lines.count > 0 then
--convert to post-processed source clob
begin
--get post-processed source
- 416
if a_object_type = 'TYPE' then
- 10
l_processed_lines := a_source_lines;
else
- 406
l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines);
end if;
--convert to clob
- 16678
for i in 1..l_processed_lines.count loop
- 16262
ut_utils.append_to_clob(l_source, replace(l_processed_lines(i), chr(13)||chr(10), chr(10)));
end loop;
--parse annotations
- 416
l_annotations := parse_object_annotations(l_source);
- 416
dbms_lob.freetemporary(l_source);
exception
when ex_package_is_wrapped or source_text_is_empty then
null;
end;
end if;
- 416
return l_annotations;
end;
end;
UT3.UT_TRIGGER_CHECK
100 % lines covered
7 relevant lines. 7 lines covered and 0 lines missed
package body ut_trigger_check is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 1
gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE';
- 1
g_is_trigger_live boolean := false;
function is_alive return boolean is
pragma autonomous_transaction;
begin
- 418
execute immediate 'create or replace synonym '||ut_utils.ut_owner||'.'||gc_check_object_name||' for no_object';
- 418
return g_is_trigger_live;
end;
procedure is_alive is
begin
- 404
if ora_dict_obj_owner is not null and ora_dict_obj_name is not null and ora_dict_obj_type is not null then
- 400
g_is_trigger_live := true;
else
- 4
g_is_trigger_live := false;
end if;
end;
end;
UT3.UT_COVERAGE
88.1 % lines covered
84 relevant lines. 74 lines covered and 10 lines missed
package body ut_coverage is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
g_coverage_id tt_coverage_id_arr;
- 1
g_develop_mode boolean not null := false;
- 1
g_is_started boolean not null := false;
procedure set_develop_mode(a_develop_mode in boolean) is
begin
- 2
g_develop_mode := a_develop_mode;
end;
function get_coverage_id(a_coverage_type in varchar2) return integer is
begin
- 20
return g_coverage_id(a_coverage_type);
end;
function is_develop_mode return boolean is
begin
- 52
return g_develop_mode;
end;
function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skip_objects ut_object_names) return varchar2 is
l_result varchar2(32767);
l_full_name varchar2(32767);
l_join_mappings varchar2(32767);
l_filters varchar2(32767);
- 10
l_mappings_cardinality integer := 0;
begin
- 10
l_result := q'[
with
trigger_source_offsets as (
select min(s.line) - 1 offset, s.owner, s.name, s.type
from {sources_view} s
where s.type = 'TRIGGER'
{filters}
and (lower(s.text) like '%begin%' or lower(s.text) like '%declare%' or lower(s.text) like '%compound%')
group by s.owner, s.name, s.type
),
sources as (
select /*+ cardinality(f {mappings_cardinality}) */
{l_full_name} as full_name, s.owner, s.name,
s.line - case when s.type = 'TRIGGER' then o.offset else 0 end as line,
s.text
from {sources_view} s {join_file_mappings}
left join trigger_source_offsets o
on (s.owner = o.owner and s.name = o.name and s.type = o.type)
where s.type in ('PACKAGE BODY', 'TYPE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER')
{filters}
),
coverage_sources as (
select full_name, owner, name, line, text,
case
when
-- to avoid execution of regexp_like on every line
-- first do a rough check for existence of search pattern keyword
(lower(s.text) like '%procedure%'
or lower(s.text) like '%function%'
or lower(s.text) like '%begin%'
or lower(s.text) like '%end%'
or lower(s.text) like '%package%'
) and
regexp_like(
s.text,
'^([\t ]*(((not)?\s*(overriding|final|instantiable)[\t ]*)*(static|constructor|member)?[\t ]*(procedure|function)|package([\t ]+body)|begin|end([\t ]+\S+)*[ \t]*;))', 'i'
)
then 'Y'
end as to_be_skipped
from sources s
)
select full_name, owner, name, line, to_be_skipped, text
from coverage_sources s
-- Exclude calls to utPLSQL framework, Unit Test packages and objects from a_exclude_list parameter of coverage reporter
where (s.owner, s.name) not in ( select /*+ cardinality(el {skipped_objects_cardinality})*/el.owner, el.name from table(:l_skipped_objects) el )
and line > 0
]';
- 10
if a_coverage_options.file_mappings is not empty then
- 5
l_mappings_cardinality := ut_utils.scale_cardinality(cardinality(a_coverage_options.file_mappings));
- 5
l_full_name := 'f.file_name';
- 5
l_join_mappings := '
join table(:file_mappings) f
on s.name = f.object_name
and s.type = f.object_type
and s.owner = f.object_owner';
else
- 5
l_full_name := q'[lower(s.owner||'.'||s.name)]';
- 5
l_filters := case
- 1
when a_coverage_options.include_objects is not empty then '
and (s.owner, s.name) in (
select /*+ cardinality(il '||ut_utils.scale_cardinality(cardinality(a_coverage_options.include_objects))||') */
il.owner, il.name
from table(:include_objects) il
)'
else '
and s.owner in (
select /*+ cardinality(t '||ut_utils.scale_cardinality(cardinality(a_coverage_options.schema_names))||') */
upper(t.column_value)
from table(:l_schema_names) t)'
end;
end if;
- 10
l_result := replace(l_result, '{sources_view}', ut_metadata.get_source_view_name());
- 10
l_result := replace(l_result, '{l_full_name}', l_full_name);
- 10
l_result := replace(l_result, '{join_file_mappings}', l_join_mappings);
- 10
l_result := replace(l_result, '{filters}', l_filters);
- 10
l_result := replace(l_result, '{mappings_cardinality}', l_mappings_cardinality);
- 10
l_result := replace(l_result, '{skipped_objects_cardinality}', ut_utils.scale_cardinality(cardinality(a_skip_objects)));
- 10
return l_result;
end;
function get_cov_sources_cursor(a_coverage_options in ut_coverage_options) return sys_refcursor is
l_cursor sys_refcursor;
l_skip_objects ut_object_names;
l_sql varchar2(32767);
begin
- 10
if not is_develop_mode() then
--skip all the utplsql framework objects and all the unit test packages that could potentially be reported by coverage.
l_skip_objects := ut_utils.get_utplsql_objects_list() multiset union all coalesce(a_coverage_options.exclude_objects, ut_object_names());
end if;
- 10
l_sql := get_cov_sources_sql(a_coverage_options, l_skip_objects);
- 10
ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_key_anyvalues().put('l_sql',l_sql) );
- 10
if a_coverage_options.file_mappings is not empty then
- 5
open l_cursor for l_sql using a_coverage_options.file_mappings, l_skip_objects;
- 5
elsif a_coverage_options.include_objects is not empty then
- 3
open l_cursor for l_sql using a_coverage_options.include_objects, a_coverage_options.include_objects, l_skip_objects;
else
- 2
open l_cursor for l_sql using a_coverage_options.schema_names, a_coverage_options.schema_names, l_skip_objects;
end if;
- 10
return l_cursor;
end;
procedure populate_tmp_table(a_coverage_options ut_coverage_options) is
pragma autonomous_transaction;
l_cov_sources_crsr sys_refcursor;
l_cov_sources_data ut_coverage_helper.t_coverage_sources_tmp_rows;
begin
- 10
if not ut_coverage_helper.is_tmp_table_populated() or is_develop_mode() then
- 10
ut_coverage_helper.cleanup_tmp_table();
- 10
l_cov_sources_crsr := get_cov_sources_cursor(a_coverage_options);
- 11
loop
- 11
fetch l_cov_sources_crsr bulk collect into l_cov_sources_data limit 10000;
- 11
ut_coverage_helper.insert_into_tmp_table(l_cov_sources_data);
- 11
exit when l_cov_sources_crsr%notfound;
end loop;
- 10
close l_cov_sources_crsr;
end if;
- 10
commit;
end;
/**
* Public functions
*/
procedure coverage_start(a_coverage_options ut_coverage_options default null) is
- 10
l_run_comment varchar2(200) := 'utPLSQL Code coverage run '||ut_utils.to_string(systimestamp);
begin
- 10
if not is_develop_mode() and not g_is_started then
ut_coverage_helper_block.coverage_start( l_run_comment, g_coverage_id(gc_block_coverage) );
ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
coverage_pause();
g_is_started := true;
end if;
end;
procedure coverage_pause is
begin
- 22
if not is_develop_mode() then
ut_coverage_helper_profiler.coverage_pause();
end if;
end;
procedure coverage_resume is
begin
- 32
ut_coverage_helper_profiler.coverage_resume();
end;
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
begin
- 3
g_develop_mode := true;
- 3
g_is_started := true;
- 3
g_coverage_id(a_coverage_type) := a_coverage_id;
end;
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
begin
- 1
g_develop_mode := true;
- 1
g_is_started := true;
- 1
g_coverage_id := a_coverage_id;
end;
procedure coverage_stop is
begin
- 10
if not is_develop_mode() then
g_is_started := false;
ut_coverage_helper_block.coverage_stop();
ut_coverage_helper_profiler.coverage_stop();
g_is_started := false;
end if;
end;
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
- 10
l_result_block ut_coverage.t_coverage;
- 10
l_result_profiler_enrich ut_coverage.t_coverage;
l_object ut_coverage.t_full_name;
l_line_no binary_integer;
begin
--prepare global temp table with sources
- 10
ut_event_manager.trigger_event('about to populate coverage temp table');
- 10
populate_tmp_table(a_coverage_options);
- 10
ut_event_manager.trigger_event('coverage temp table populated');
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
-- tmp table for block again.
- 10
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );
- 10
ut_event_manager.trigger_event('profiler coverage data retrieved');
-- If block coverage available we will use it.
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
- 10
l_result_block := ut_coverage_block.get_coverage_data( a_coverage_options, get_coverage_id(gc_block_coverage) );
- 10
ut_event_manager.trigger_event('block coverage data retrieved');
-- Enrich profiler results with some of the block results
- 10
l_object := l_result_profiler_enrich.objects.first;
- 56
while (l_object is not null) loop
- 46
l_line_no := l_result_profiler_enrich.objects(l_object).lines.first;
-- to avoid no data found check if we got object in profiler
- 46
if l_result_block.objects.exists(l_object) then
- 59
while (l_line_no is not null) loop
-- To avoid no data check for object line
- 16
if l_result_block.objects(l_object).lines.exists(l_line_no) then
-- enrich line level stats
- 12
l_result_profiler_enrich.objects(l_object).lines(l_line_no).partcove := l_result_block.objects(l_object).lines(l_line_no).partcove;
- 12
l_result_profiler_enrich.objects(l_object).lines(l_line_no).covered_blocks := l_result_block.objects(l_object).lines(l_line_no).covered_blocks;
- 12
l_result_profiler_enrich.objects(l_object).lines(l_line_no).no_blocks := l_result_block.objects(l_object).lines(l_line_no).no_blocks;
-- enrich object level stats
- 12
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;
end if;
--At the end go to next line
- 16
l_line_no := l_result_profiler_enrich.objects(l_object).lines.next(l_line_no);
end loop;
--total level stats enrich
- 43
l_result_profiler_enrich.partcovered_lines := nvl(l_result_profiler_enrich.partcovered_lines,0) + l_result_profiler_enrich.objects(l_object).partcovered_lines;
-- At the end go to next object
end if;
- 46
l_object := l_result_profiler_enrich.objects.next(l_object);
end loop;
- 10
ut_event_manager.trigger_event('coverage data combined');
$end
- 10
return l_result_profiler_enrich;
end get_coverage_data;
end;
UT3.UT_COVERAGE_BLOCK
92.31 % lines covered
52 relevant lines. 48 lines covered and 4 lines missed
package body ut_coverage_block is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_source_lines is table of binary_integer;
/**
* Public functions
*/
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) return ut_coverage.t_coverage is
l_line_calls ut_coverage_helper.t_unit_line_calls;
- 10
l_result ut_coverage.t_coverage;
- 10
l_new_unit ut_coverage.t_unit_coverage;
l_line_no binary_integer;
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
l_source_object ut_coverage_helper.t_tmp_table_object;
begin
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
- 10
l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
- 56
loop
- 56
fetch l_source_objects_crsr
into l_source_object;
- 56
exit when l_source_objects_crsr%notfound;
--get coverage data
- 46
l_line_calls := ut_coverage_helper_block.get_raw_coverage_data(l_source_object.owner, l_source_object.name, a_coverage_id);
--if there is coverage, we need to filter out the garbage (badly indicated data)
- 46
if l_line_calls.count > 0 then
--remove lines that should not be indicted as meaningful
- 40
for i in 1 .. l_source_object.to_be_skipped_list.count loop
- 36
if l_source_object.to_be_skipped_list(i) is not null then
- 36
l_line_calls.delete(l_source_object.to_be_skipped_list(i));
end if;
end loop;
end if;
--if there are no file mappings or object was actually captured by profiler
- 46
if a_coverage_options.file_mappings is null or l_line_calls.count > 0 then
--populate total stats
- 43
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
--populate object level coverage stats
- 43
if not l_result.objects.exists(l_source_object.full_name) then
- 43
l_result.objects(l_source_object.full_name) := l_new_unit;
- 43
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
- 43
l_result.objects(l_source_object.full_name).name := l_source_object.name;
- 43
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
end if;
--map to results
- 43
l_line_no := l_line_calls.first;
- 43
if l_line_no is null then
- 39
l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
- 39
l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
- 1
else
- 16
loop
- 16
exit when l_line_no is null;
--turn the block coverage into a line coverage format to allow for reading.
--whenever the linst is a part covered treat that line as a hit and execution but only part covered
--total stats
--Get total blocks ,blocks covered, blocks not covered this will be used for PCT calc
- 12
l_result.total_blocks := nvl(l_result.total_blocks, 0) + l_line_calls(l_line_no).blocks;
- 12
l_result.covered_blocks := nvl(l_result.covered_blocks, 0) + l_line_calls(l_line_no).covered_blocks;
- 12
l_result.uncovered_blocks := nvl(l_result.uncovered_blocks, 0) +
(l_line_calls(l_line_no).blocks - l_line_calls(l_line_no).covered_blocks);
--If line is partially covered add as part line cover and covered for line reporter
- 12
if l_line_calls(l_line_no).partcovered = 1 then
- 4
l_result.partcovered_lines := l_result.partcovered_lines + 1;
end if;
- 12
if l_line_calls(l_line_no).covered_blocks > 0 then
- 12
l_result.covered_lines := l_result.covered_lines + 1;
end if;
-- Use nvl as be default is null and screw the calcs
--Increase total blocks
- 12
l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := l_line_calls(l_line_no).blocks;
- 12
l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := l_line_calls(l_line_no).covered_blocks;
- 12
l_result.objects(l_source_object.full_name).total_blocks := nvl(l_result.objects(l_source_object.full_name)
.total_blocks
,0) + l_line_calls(l_line_no).blocks;
--Total uncovered blocks is a line blocks minus covered blocsk
- 12
l_result.objects(l_source_object.full_name).uncovered_blocks := nvl(l_result.objects(l_source_object.full_name)
.uncovered_blocks
,0) +
(l_line_calls(l_line_no).blocks - l_line_calls(l_line_no)
.covered_blocks);
--If we have any covered blocks in line
- 12
if l_line_calls(l_line_no).covered_blocks > 0 then
--If any block is covered then we have a hit on that line
- 12
l_result.executions := l_result.executions + 1;
--object level stats
--If its part covered then mark it else treat as full cov
- 12
if l_line_calls(l_line_no).partcovered = 1 then
- 4
l_result.objects(l_source_object.full_name).partcovered_lines := l_result.objects(l_source_object.full_name)
.partcovered_lines + 1;
end if;
- 12
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
.covered_lines + 1;
--How many blocks we covered
- 12
l_result.objects(l_source_object.full_name).covered_blocks := nvl(l_result.objects(l_source_object.full_name)
.covered_blocks
,0) + l_line_calls(l_line_no)
.covered_blocks;
--Object line executions
- 12
l_result.objects(l_source_object.full_name).executions := nvl(l_result.objects(l_source_object.full_name)
.executions
,0) + 1;
- 12
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 1;
--Whenever there is no covered block treat as uncovered (query returns only lines where the blocks are in code so we
--dont have a false results here when there is no blocks
elsif l_line_calls(l_line_no).covered_blocks = 0 then
l_result.uncovered_lines := l_result.uncovered_lines + 1;
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name)
.uncovered_lines + 1;
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 0;
end if;
--increase part covered counter (+ 1/0)
- 12
l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := l_line_calls(l_line_no).partcovered;
- 12
l_line_no := l_line_calls.next(l_line_no);
end loop;
end if;
end if;
end loop;
- 10
close l_source_objects_crsr;
$end
- 10
return l_result;
end get_coverage_data;
end;
UT3.UT_COVERAGE_HELPER
90 % lines covered
10 relevant lines. 9 lines covered and 1 lines missed
package body ut_coverage_helper is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_proftab_row is record (
line binary_integer,
calls number(38,0)
);
type t_proftab_rows is table of t_proftab_row;
type t_block_row is record(
line binary_integer
,blocks binary_integer
,covered_blocks binary_integer);
type t_block_rows is table of t_block_row;
procedure insert_into_tmp_table(a_data t_coverage_sources_tmp_rows) is
begin
- 11
forall i in 1 .. a_data.count
insert into ut_coverage_sources_tmp
(full_name,owner,name,line,text, to_be_skipped)
values(a_data(i).full_name,a_data(i).owner,a_data(i).name,a_data(i).line,a_data(i).text,a_data(i).to_be_skipped);
end;
procedure cleanup_tmp_table is
pragma autonomous_transaction;
begin
- 126
execute immediate 'truncate table ut_coverage_sources_tmp';
end;
function is_tmp_table_populated return boolean is
l_result integer;
begin
- 10
select 1 into l_result from ut_coverage_sources_tmp where rownum = 1;
return (l_result = 1);
exception
- 20
when no_data_found then
- 10
return false;
end;
function get_tmp_table_objects_cursor return t_tmp_table_objects_crsr is
l_result t_tmp_table_objects_crsr;
begin
- 20
open l_result for
select o.owner, o.name, o.full_name, max(o.line) lines_count,
cast(
collect(decode(to_be_skipped, 'Y', to_char(line))) as ut_varchar2_list
) to_be_skipped_list
from ut_coverage_sources_tmp o
group by o.owner, o.name, o.full_name;
- 20
return l_result;
end;
function get_tmp_table_object_lines(a_owner varchar2, a_object_name varchar2) return ut_varchar2_list is
l_result ut_varchar2_list;
begin
- 1
select rtrim(s.text,chr(10)) text
bulk collect into l_result
from ut_coverage_sources_tmp s
where s.owner = a_owner
and s.name = a_object_name
order by s.line;
- 1
return l_result;
end;
end;
UT3.UT_COVERAGE_HELPER_BLOCK
83.33 % lines covered
12 relevant lines. 10 lines covered (including 1 lines partially covered ) and 2 lines missed
package body ut_coverage_helper_block is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_proftab_row is record (
line binary_integer,
calls number(38,0)
);
type t_proftab_rows is table of t_proftab_row;
type t_block_row is record(
line binary_integer
,blocks binary_integer
,covered_blocks binary_integer);
type t_block_rows is table of t_block_row;
procedure coverage_start(a_run_comment varchar2, a_coverage_id out integer) is
begin
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
a_coverage_id := dbms_plsql_code_coverage.start_coverage(run_comment => a_run_comment);
$else
null;
$end
end;
procedure coverage_stop is
begin
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
dbms_plsql_code_coverage.stop_coverage();
$else
null;
$end
end;
function block_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return t_block_rows is
l_coverage_rows t_block_rows;
begin
- 46
select ccb.line as line,
count(ccb.block) as blocks,
sum(ccb.covered) as covered_blocks
bulk collect into l_coverage_rows
from dbmspcc_units ccu
left outer join dbmspcc_blocks ccb
on ccu.run_id = ccb.run_id
and ccu.object_id = ccb.object_id
where ccu.run_id = a_coverage_id
and ccu.owner = a_object_owner
and ccu.name = a_object_name
group by ccb.line
order by 1;
- 46
return l_coverage_rows;
end;
function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls is
l_tmp_data t_block_rows;
l_results ut_coverage_helper.t_unit_line_calls;
begin
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
- 46
l_tmp_data := block_results(a_object_owner, a_object_name, a_coverage_id);
- 58
for i in 1 .. l_tmp_data.count loop
- 12
l_results(l_tmp_data(i).line).blocks := l_tmp_data(i).blocks;
- 12
l_results(l_tmp_data(i).line).covered_blocks := l_tmp_data(i).covered_blocks;
- 12
l_results(l_tmp_data(i).line).partcovered := case
- 1/2 1
when (l_tmp_data(i).covered_blocks > 0) and
- 1
(l_tmp_data(i).blocks > l_tmp_data(i).covered_blocks) then
1
else
0
end;
end loop;
$end
- 46
return l_results;
end;
end;
UT3.UT_COVERAGE_HELPER_PROFILER
70 % lines covered
10 relevant lines. 7 lines covered and 3 lines missed
package body ut_coverage_helper_profiler is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_proftab_row is record (
line binary_integer,
calls number(38,0)
);
type t_proftab_rows is table of t_proftab_row;
type t_block_row is record(
line binary_integer
,blocks binary_integer
,covered_blocks binary_integer);
type t_block_rows is table of t_block_row;
procedure coverage_start(a_run_comment varchar2,a_coverage_id out integer) is
begin
dbms_profiler.start_profiler(run_comment => a_run_comment, run_number => a_coverage_id);
end;
procedure coverage_pause is
l_return_code binary_integer;
begin
l_return_code := dbms_profiler.pause_profiler();
end;
procedure coverage_resume is
l_return_code binary_integer;
begin
- 22
l_return_code := dbms_profiler.resume_profiler();
end;
procedure coverage_stop is
begin
dbms_profiler.stop_profiler();
end;
function proftab_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return t_proftab_rows is
l_coverage_rows t_proftab_rows;
begin
- 46
select
d.line#,
case when sum(d.total_occur) = 0 and sum(d.total_time) > 0 then 1 else sum(d.total_occur) end total_occur
bulk collect into l_coverage_rows
from plsql_profiler_units u
join plsql_profiler_data d
on u.runid = d.runid
and u.unit_number = d.unit_number
where u.runid = a_coverage_id
and u.unit_owner = a_object_owner
and u.unit_name = a_object_name
and u.unit_type in ('PACKAGE BODY', 'TYPE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER')
group by d.line#;
- 46
return l_coverage_rows;
end;
function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls is
l_tmp_data t_proftab_rows;
l_results ut_coverage_helper.t_unit_line_calls;
begin
- 46
l_tmp_data := proftab_results(a_object_owner, a_object_name, a_coverage_id);
- 71
for i in 1 .. l_tmp_data.count loop
- 25
l_results(l_tmp_data(i).line).calls := l_tmp_data(i).calls;
end loop;
- 46
return l_results;
end;
end;
UT3.UT_COVERAGE_PROFILER
100 % lines covered
37 relevant lines. 37 lines covered and 0 lines missed
package body ut_coverage_profiler is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
/**
* Public functions
*/
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) return ut_coverage.t_coverage is
l_line_calls ut_coverage_helper.t_unit_line_calls;
- 10
l_result ut_coverage.t_coverage;
- 10
l_new_unit ut_coverage.t_unit_coverage;
l_line_no binary_integer;
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
l_source_object ut_coverage_helper.t_tmp_table_object;
begin
- 10
l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
- 56
loop
- 56
fetch l_source_objects_crsr into l_source_object;
- 56
exit when l_source_objects_crsr%notfound;
--get coverage data
- 46
l_line_calls := ut_coverage_helper_profiler.get_raw_coverage_data( l_source_object.owner, l_source_object.name, a_coverage_id);
--if there is coverage, we need to filter out the garbage (badly indicated data from dbms_profiler)
- 46
if l_line_calls.count > 0 then
--remove lines that should not be indicted as meaningful
- 70
for i in 1 .. l_source_object.to_be_skipped_list.count loop
- 63
if l_source_object.to_be_skipped_list(i) is not null then
- 63
l_line_calls.delete(l_source_object.to_be_skipped_list(i));
end if;
end loop;
end if;
--if there are no file mappings or object was actually captured by profiler
- 46
if a_coverage_options.file_mappings is null or l_line_calls.count > 0 then
--populate total stats
- 46
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
--populate object level coverage stats
- 46
if not l_result.objects.exists(l_source_object.full_name) then
- 46
l_result.objects(l_source_object.full_name) := l_new_unit;
- 46
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
- 46
l_result.objects(l_source_object.full_name).name := l_source_object.name;
- 46
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
end if;
--map to results
- 46
l_line_no := l_line_calls.first;
- 46
if l_line_no is null then
- 39
l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
- 39
l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
- 1
else
- 32
loop
- 32
exit when l_line_no is null;
- 25
if l_line_calls(l_line_no).calls > 0 then
--total stats
- 18
l_result.covered_lines := l_result.covered_lines + 1;
- 18
l_result.executions := l_result.executions + l_line_calls(l_line_no).calls;
--object level stats
- 18
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name).covered_lines + 1;
- 18
l_result.objects(l_source_object.full_name).executions := l_result.objects(l_source_object.full_name).executions + l_line_calls(l_line_no).calls;
- 7
elsif l_line_calls(l_line_no).calls = 0 then
- 7
l_result.uncovered_lines := l_result.uncovered_lines + 1;
- 7
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name).uncovered_lines + 1;
end if;
- 25
l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_line_calls(l_line_no).calls;
- 25
l_line_no := l_line_calls.next(l_line_no);
end loop;
end if;
end if;
end loop;
- 10
close l_source_objects_crsr;
- 10
return l_result;
end get_coverage_data;
end;
UT3.UT_COVERAGE_REPORTER_BASE
100 % lines covered
16 relevant lines. 16 lines covered and 0 lines missed
type body ut_coverage_reporter_base is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
overriding final member procedure before_calling_run(self in out nocopy ut_coverage_reporter_base, a_run ut_run) as
begin
- 10
(self as ut_output_reporter_base).before_calling_run(a_run);
- 10
ut_coverage.coverage_start(a_coverage_options => a_run.coverage_options);
end;
overriding final member procedure before_calling_before_all(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_before_all (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_before_each(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 3
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_before_each (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 3
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_before_test(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_before_test (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_test_execute(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 12
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_test_execute (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 12
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_after_test(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_after_test (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_after_each(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 3
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_after_each (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 3
ut_coverage.coverage_pause();
end;
overriding final member procedure before_calling_after_all(self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_resume();
end;
overriding final member procedure after_calling_after_all (self in out nocopy ut_coverage_reporter_base, a_executable in ut_executable) is
begin
- 1
ut_coverage.coverage_pause();
end;
end;
UT3.UT_EVENT_MANAGER
75.68 % lines covered
37 relevant lines. 28 lines covered and 9 lines missed
package body ut_event_manager as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_listeners is table of ut_event_listener;
subtype t_listener_number is binary_integer;
type t_listener_numbers is table of boolean index by t_listener_number;
type t_events_listeners is table of t_listener_numbers index by t_event_name;
type t_event_manager is record (
event_listener_index t_events_listeners,
listeners t_listeners
);
type t_event_managers is table of t_event_manager;
g_event_listeners_index t_events_listeners;
g_listeners t_listeners;
g_suspended_event_managers t_event_managers;
procedure initialize is
begin
- 116
if g_listeners is not null and g_listeners.count > 0 then
if g_suspended_event_managers is null then
g_suspended_event_managers := t_event_managers();
end if;
g_suspended_event_managers.extend;
g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index := g_event_listeners_index;
g_suspended_event_managers(g_suspended_event_managers.count).listeners := g_listeners;
end if;
- 116
g_event_listeners_index.delete;
- 116
g_listeners := t_listeners();
end;
procedure dispose_listeners is
begin
- 116
if g_suspended_event_managers is not null and g_suspended_event_managers.count > 0 then
g_event_listeners_index := g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index;
g_listeners := g_suspended_event_managers(g_suspended_event_managers.count).listeners;
g_suspended_event_managers.trim(1);
else
- 116
g_event_listeners_index.delete;
- 116
g_listeners := t_listeners();
end if;
end;
procedure trigger_event( a_event_name t_event_name, a_event_object ut_event_item := null ) is
procedure trigger_listener_event(
a_listener_numbers t_listener_numbers,
a_event_name t_event_name,
a_event_object ut_event_item
) is
- 2721
l_listener_number t_listener_number := a_listener_numbers.first;
begin
- 7923
while l_listener_number is not null loop
- 5202
g_listeners(l_listener_number).on_event(a_event_name, a_event_object);
- 5202
l_listener_number := a_listener_numbers.next(l_listener_number);
end loop;
end;
begin
- 7619
if a_event_name is not null then
- 7619
if g_event_listeners_index.exists(gc_all) then
- 76
trigger_listener_event( g_event_listeners_index(gc_all), a_event_name, a_event_object );
end if;
- 7619
if g_event_listeners_index.exists(a_event_name) then
- 2645
trigger_listener_event( g_event_listeners_index(a_event_name), a_event_name, a_event_object );
end if;
- 7619
if a_event_name = ut_event_manager.gc_finalize then
- 116
dispose_listeners();
end if;
end if;
end;
procedure add_event( a_event_name t_event_name, a_listener_pos binary_integer ) is
begin
- 4967
g_event_listeners_index(a_event_name)(a_listener_pos) := true;
end;
procedure add_events( a_event_names ut_varchar2_list, a_listener_pos binary_integer ) is
begin
- 5199
for i in 1 .. a_event_names.count loop
- 4967
add_event( a_event_names(i), a_listener_pos );
end loop;
end;
function add_listener( a_listener ut_event_listener ) return t_listener_number is
begin
- 232
if g_listeners is null then
g_listeners := t_listeners();
end if;
- 232
g_listeners.extend;
- 232
g_listeners(g_listeners.last) := a_listener;
- 232
return g_listeners.last;
end;
procedure add_listener( a_listener ut_event_listener ) is
l_event_names ut_varchar2_list;
begin
- 232
if a_listener is not null then
- 232
l_event_names := a_listener.get_supported_events();
- 232
if l_event_names is not empty then
- 232
add_events( l_event_names, add_listener( a_listener ) );
end if;
end if;
end;
end;
UT3.UT_OUTPUT_BUFFER_BASE
100 % lines covered
26 relevant lines. 26 lines covered and 0 lines missed
type body ut_output_buffer_base is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_output_buffer_base, a_output_id raw := null, a_self_type varchar2 := null) is
pragma autonomous_transaction;
l_exists int;
begin
- 247
cleanup_buffer();
- 247
self.self_type := coalesce(a_self_type,self.self_type);
- 247
self.output_id := coalesce(a_output_id, self.output_id, sys_guid());
- 247
self.start_date := coalesce(self.start_date, sysdate);
- 247
self.last_message_id := 0;
- 247
select count(*) into l_exists from ut_output_buffer_info_tmp where output_id = self.output_id;
- 247
if ( l_exists > 0 ) then
- 119
update ut_output_buffer_info_tmp set start_date = self.start_date where output_id = self.output_id;
else
- 128
insert into ut_output_buffer_info_tmp(output_id, start_date) values (self.output_id, self.start_date);
end if;
- 247
commit;
- 247
self.is_closed := 0;
end;
member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor is
l_lines sys_refcursor;
begin
- 117
open l_lines for
select text, item_type
from table(self.get_lines(a_initial_timeout, a_timeout_sec));
- 117
return l_lines;
end;
member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null) is
l_data sys_refcursor;
l_clob clob;
l_item_type varchar2(32767);
l_lines ut_varchar2_list;
begin
- 32
l_data := self.get_lines_cursor(a_initial_timeout, a_timeout_sec);
- 629
loop
- 629
fetch l_data into l_clob, l_item_type;
- 629
exit when l_data%notfound;
- 597
l_lines := ut_utils.clob_to_table(l_clob);
- 1206
for i in 1 .. l_lines.count loop
- 609
dbms_output.put_line(l_lines(i));
end loop;
end loop;
- 32
close l_data;
end;
member procedure cleanup_buffer(self in ut_output_buffer_base, a_retention_time_sec natural := null) is
- 247
gc_buffer_retention_sec constant naturaln := coalesce(a_retention_time_sec, 60 * 60 * 24); -- 24 hours
- 247
l_retention_days number := gc_buffer_retention_sec / (60 * 60 * 24);
- 247
l_max_retention_date date := sysdate - l_retention_days;
pragma autonomous_transaction;
begin
- 247
delete from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date;
- 247
commit;
end;
end;
UT3.UT_OUTPUT_CLOB_TABLE_BUFFER
98.21 % lines covered
56 relevant lines. 55 lines covered (including 1 lines partially covered ) and 1 lines missed
type body ut_output_clob_table_buffer is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_output_clob_table_buffer(self in out nocopy ut_output_clob_table_buffer, a_output_id raw := null) return self as result is
begin
- 5
self.init(a_output_id, $$plsql_unit);
- 5
return;
end;
overriding member procedure close(self in out nocopy ut_output_clob_table_buffer) is
pragma autonomous_transaction;
begin
- 4
self.last_message_id := self.last_message_id + 1;
- 4
insert into ut_output_clob_buffer_tmp(output_id, message_id, is_finished)
values (self.output_id, self.last_message_id, 1);
- 4
commit;
- 4
self.is_closed := 1;
end;
overriding member procedure send_line(self in out nocopy ut_output_clob_table_buffer, a_text varchar2, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
- 309
if a_text is not null or a_item_type is not null then
- 309
self.last_message_id := self.last_message_id + 1;
- 309
insert into ut_output_clob_buffer_tmp(output_id, message_id, text, item_type)
values (self.output_id, self.last_message_id, a_text, a_item_type);
end if;
- 309
commit;
end;
overriding member procedure send_lines(self in out nocopy ut_output_clob_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
- 53
insert into ut_output_clob_buffer_tmp(output_id, message_id, text, item_type)
select self.output_id, self.last_message_id + rownum, t.column_value, a_item_type
from table(a_text_list) t
where t.column_value is not null or a_item_type is not null;
- 53
self.last_message_id := self.last_message_id + SQL%rowcount;
- 53
commit;
end;
overriding member procedure send_clob(self in out nocopy ut_output_clob_table_buffer, a_text clob, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
- 1/2 31
if a_text is not null and a_text != empty_clob() or a_item_type is not null then
- 31
self.last_message_id := self.last_message_id + 1;
- 31
insert into ut_output_clob_buffer_tmp(output_id, message_id, text, item_type)
values (self.output_id, self.last_message_id, a_text, a_item_type);
end if;
- 31
commit;
end;
overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined is
type t_rowid_tab is table of urowid;
l_message_rowids t_rowid_tab;
l_buffer_data ut_output_data_rows;
l_finished_flags ut_integer_list;
- 4
l_already_waited_for number(10,2) := 0;
- 4
l_finished boolean := false;
- 4
lc_init_wait_sec constant naturaln := coalesce(a_initial_timeout, 60 ); -- 1 minute
- 4
lc_max_wait_sec constant naturaln := coalesce(a_timeout_sec, 60 * 60 * 4); -- 4 hours
- 4
l_wait_for integer := lc_init_wait_sec;
- 4
lc_short_sleep_time constant number(1,1) := 0.1; --sleep for 100 ms between checks
- 4
lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long
- 4
lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec
- 4
l_sleep_time number(2,1) := lc_short_sleep_time;
- 4
lc_bulk_limit constant integer := 5000;
- 4
l_max_message_id integer := lc_bulk_limit;
procedure remove_read_data(a_message_rowids t_rowid_tab) is
pragma autonomous_transaction;
begin
- 3
forall i in 1 .. a_message_rowids.count
- 1
delete from ut_output_clob_buffer_tmp a
where rowid = a_message_rowids(i);
- 3
commit;
end;
procedure remove_buffer_info is
pragma autonomous_transaction;
begin
- 4
delete from ut_output_buffer_info_tmp a
where a.output_id = self.output_id;
- 4
commit;
end;
begin
- 7
while not l_finished loop
- 4
with ordered_buffer as (
select /*+ index(a) */ a.rowid, ut_output_data_row(a.text, a.item_type), is_finished
from ut_output_clob_buffer_tmp a
where a.output_id = self.output_id
and a.message_id <= l_max_message_id
order by a.message_id
)
select b.*
bulk collect into l_message_rowids, l_buffer_data, l_finished_flags
from ordered_buffer b;
--nothing fetched from output, wait and try again
- 4
if l_buffer_data.count = 0 then
$if dbms_db_version.version >= 18 $then
- 1
dbms_session.sleep(l_sleep_time);
$else
dbms_lock.sleep(l_sleep_time);
$end
- 1
l_already_waited_for := l_already_waited_for + l_sleep_time;
- 1
if l_already_waited_for > lc_long_wait_time then
l_sleep_time := lc_long_sleep_time;
end if;
else
--reset wait time
-- we wait lc_max_wait_sec for new message
- 3
l_wait_for := lc_max_wait_sec;
- 3
l_already_waited_for := 0;
- 3
l_sleep_time := lc_short_sleep_time;
- 59
for i in 1 .. l_buffer_data.count loop
- 2540
if l_buffer_data(i).text is not null then
- 2482
pipe row(l_buffer_data(i));
- 58
elsif l_finished_flags(i) = 1 then
- 3
l_finished := true;
- 3
exit;
end if;
end loop;
- 3
remove_read_data(l_message_rowids);
- 3
l_max_message_id := l_max_message_id + lc_bulk_limit;
end if;
- 4
if l_finished or l_already_waited_for >= l_wait_for then
- 4
remove_buffer_info();
- 4
if l_already_waited_for > 0 and l_already_waited_for >= l_wait_for then
- 1
raise_application_error(
ut_utils.gc_out_buffer_timeout,
'Timeout occurred while waiting for output data. Waited for: '||l_already_waited_for||' seconds.'
);
end if;
end if;
end loop;
- 3
return;
end;
end;
UT3.UT_OUTPUT_TABLE_BUFFER
86.21 % lines covered
58 relevant lines. 50 lines covered and 8 lines missed
type body ut_output_table_buffer is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_output_table_buffer(self in out nocopy ut_output_table_buffer, a_output_id raw := null) return self as result is
begin
- 123
self.init(a_output_id, $$plsql_unit);
- 123
return;
end;
overriding member procedure close(self in out nocopy ut_output_table_buffer) is
pragma autonomous_transaction;
begin
- 117
self.last_message_id := self.last_message_id + 1;
- 117
insert into ut_output_buffer_tmp(output_id, message_id, is_finished)
values (self.output_id, self.last_message_id, 1);
- 117
commit;
- 117
self.is_closed := 1;
end;
overriding member procedure send_line(self in out nocopy ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
- 1505
if a_text is not null or a_item_type is not null then
- 1504
if length(a_text) > ut_utils.gc_max_storage_varchar2_len then
self.send_lines(
ut_utils.convert_collection(
ut_utils.clob_to_table(a_text, ut_utils.gc_max_storage_varchar2_len)
),
a_item_type
);
else
- 1504
self.last_message_id := self.last_message_id + 1;
- 1504
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
values (self.output_id, self.last_message_id, a_text, a_item_type);
end if;
- 1504
commit;
end if;
end;
overriding member procedure send_lines(self in out nocopy ut_output_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
- 282
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
select self.output_id, self.last_message_id + rownum, t.column_value, a_item_type
from table(a_text_list) t
where t.column_value is not null or a_item_type is not null;
- 282
self.last_message_id := self.last_message_id + SQL%rowcount;
- 282
commit;
end;
overriding member procedure send_clob(self in out nocopy ut_output_table_buffer, a_text clob, a_item_type varchar2 := null) is
pragma autonomous_transaction;
begin
if a_text is not null and a_text != empty_clob() or a_item_type is not null then
if length(a_text) > ut_utils.gc_max_storage_varchar2_len then
self.send_lines(
ut_utils.convert_collection(
ut_utils.clob_to_table(a_text, ut_utils.gc_max_storage_varchar2_len)
),
a_item_type
);
else
self.last_message_id := self.last_message_id + 1;
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
values (self.output_id, self.last_message_id, a_text, a_item_type);
end if;
commit;
end if;
end;
overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined is
l_buffer_data ut_varchar2_rows;
l_item_types ut_varchar2_rows;
l_finished_flags ut_integer_list;
- 116
l_already_waited_for number(10,2) := 0;
- 116
l_finished boolean := false;
- 116
lc_init_wait_sec constant naturaln := coalesce(a_initial_timeout, 60 ); -- 1 minute
- 116
lc_max_wait_sec constant naturaln := coalesce(a_timeout_sec, 60 * 60 * 4); -- 4 hours
- 116
l_wait_for integer := lc_init_wait_sec;
- 116
lc_short_sleep_time constant number(1,1) := 0.1; --sleep for 100 ms between checks
- 116
lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long
- 116
lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec
- 116
l_sleep_time number(2,1) := lc_short_sleep_time;
- 116
lc_bulk_limit constant integer := 5000;
- 116
l_max_message_id integer := lc_bulk_limit;
procedure get_data_from_buffer(
a_max_message_id integer,
a_buffer_data out nocopy ut_varchar2_rows,
a_item_types out nocopy ut_varchar2_rows,
a_finished_flags out nocopy ut_integer_list
) is
pragma autonomous_transaction;
begin
- 128
delete from (
select *
from ut_output_buffer_tmp o
where o.output_id = self.output_id
and o.message_id <= a_max_message_id
order by o.message_id
) d
returning d.text, d.item_type, d.is_finished
bulk collect into a_buffer_data, a_item_types, a_finished_flags;
- 128
commit;
end;
procedure remove_buffer_info is
pragma autonomous_transaction;
begin
- 116
delete from ut_output_buffer_info_tmp a
where a.output_id = self.output_id;
- 116
commit;
end;
begin
- 242
while not l_finished loop
- 128
get_data_from_buffer( l_max_message_id, l_buffer_data, l_item_types, l_finished_flags);
--nothing fetched from output, wait and try again
- 128
if l_buffer_data.count = 0 then
$if dbms_db_version.version >= 18 $then
- 11
dbms_session.sleep(l_sleep_time);
$else
dbms_lock.sleep(l_sleep_time);
$end
- 11
l_already_waited_for := l_already_waited_for + l_sleep_time;
- 11
if l_already_waited_for > lc_long_wait_time then
l_sleep_time := lc_long_sleep_time;
end if;
else
--reset wait time
-- we wait lc_max_wait_sec for new message
- 117
l_wait_for := lc_max_wait_sec;
- 117
l_already_waited_for := 0;
- 117
l_sleep_time := lc_short_sleep_time;
- 232
for i in 1 .. l_buffer_data.count loop
- 14921
if l_buffer_data(i) is not null then
- 14695
pipe row(ut_output_data_row(l_buffer_data(i),l_item_types(i)));
- 226
elsif l_finished_flags(i) = 1 then
- 114
l_finished := true;
- 114
exit;
end if;
end loop;
- 117
l_max_message_id := l_max_message_id + lc_bulk_limit;
end if;
- 128
if l_finished or l_already_waited_for >= l_wait_for then
- 116
remove_buffer_info();
- 116
if l_already_waited_for > 0 and l_already_waited_for >= l_wait_for then
- 2
raise_application_error(
ut_utils.gc_out_buffer_timeout,
'Timeout occurred while waiting for output data. Waited for: '||l_already_waited_for||' seconds.'
);
end if;
end if;
end loop;
- 114
return;
end;
end;
UT3.UT_SESSION_CONTEXT
85.71 % lines covered
7 relevant lines. 6 lines covered and 1 lines missed
package body ut_session_context as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
$IF $$SELF_TESTING_INSTALL $THEN
gc_context_name constant varchar2(30) := ut_utils.ut_owner()||'_INFO';
$ELSE
- 1
gc_context_name constant varchar2(30) := 'UT3_INFO';
$END
procedure set_context(a_name varchar2, a_value varchar2) is
begin
- 3288
dbms_session.set_context( gc_context_name, a_name, a_value );
end;
procedure clear_context(a_name varchar2) is
begin
- 3284
dbms_session.clear_context( namespace => gc_context_name, attribute => a_name );
end;
procedure clear_all_context is
begin
- 120
dbms_session.clear_all_context( namespace => gc_context_name );
end;
function is_ut_run return boolean is
l_paths varchar2(32767);
begin
- 799
l_paths := sys_context(gc_context_name, 'RUN_PATHS');
- 799
return l_paths is not null;
end;
function get_namespace return varchar2 is
begin
return gc_context_name;
end;
end;
UT3.UT_SESSION_INFO
98.68 % lines covered
76 relevant lines. 75 lines covered and 1 lines missed
type body ut_session_info as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_session_info(self in out nocopy ut_session_info) return self as result is
begin
- 116
self.self_type := $$plsql_unit;
- 116
dbms_application_info.read_client_info( client_info );
- 116
dbms_application_info.read_module( module, action );
- 116
return;
end;
-- run hooks
member procedure before_calling_run(self in out nocopy ut_session_info, a_run in ut_run) is
begin
- 115
ut_session_context.set_context( 'run_paths', ut_utils.to_string( ut_utils.table_to_clob( a_run.run_paths,',' ), null ) );
- 115
dbms_application_info.set_module( 'utPLSQL', null );
end;
member procedure after_calling_run(self in out nocopy ut_session_info, a_run in ut_run) is
begin
- 115
ut_session_context.clear_context( 'run_paths' );
- 115
dbms_application_info.set_module( module, action );
- 115
dbms_application_info.set_client_info( client_info );
end;
-- suite hooks
member procedure before_calling_suite(self in out nocopy ut_session_info, a_suite in ut_logical_suite) is
begin
- 333
if a_suite is not of (ut_suite_context) then
- 322
ut_session_context.set_context( 'suite_path', a_suite.path );
- 322
ut_session_context.set_context( 'suite_package', a_suite.object_owner||'.'||a_suite.object_name );
- 322
ut_session_context.set_context( 'suite_description', a_suite.description );
- 322
ut_session_context.set_context( 'suite_start_time', ut_utils.to_string(a_suite.start_time) );
- 322
dbms_application_info.set_module( 'utPLSQL', a_suite.object_name );
else
- 11
ut_session_context.set_context( 'context_name', a_suite.name );
- 11
ut_session_context.set_context( 'context_path', a_suite.path);
- 11
ut_session_context.set_context( 'context_description', a_suite.description );
- 11
ut_session_context.set_context( 'context_start_time', ut_utils.to_string(a_suite.start_time) );
end if;
end;
member procedure after_calling_suite(self in out nocopy ut_session_info, a_suite in ut_logical_suite) is
begin
- 333
if a_suite is not of (ut_suite_context) then
- 322
ut_session_context.clear_context( 'suite_package' );
- 322
ut_session_context.clear_context( 'suite_path' );
- 322
ut_session_context.clear_context( 'suite_description' );
- 322
ut_session_context.clear_context( 'suite_start_time' );
else
- 11
ut_session_context.clear_context( 'context_name' );
- 11
ut_session_context.clear_context( 'context_path' );
- 11
ut_session_context.clear_context( 'context_description' );
- 11
ut_session_context.clear_context( 'context_start_time' );
end if;
end;
member procedure before_calling_test(self in out nocopy ut_session_info, a_test in ut_test) is
begin
- 319
ut_session_context.set_context( 'test_name', a_test.object_owner||'.'||a_test.object_name||'.'||a_test.name );
- 319
ut_session_context.set_context( 'test_description', a_test.description );
- 319
ut_session_context.set_context( 'test_start_time', ut_utils.to_string(a_test.start_time) );
end;
member procedure after_calling_test (self in out nocopy ut_session_info, a_test in ut_test) is
begin
- 319
ut_session_context.clear_context( 'test_name' );
- 319
ut_session_context.clear_context( 'test_description' );
- 319
ut_session_context.clear_context( 'test_start_time' );
end;
member procedure before_calling_executable(self in out nocopy ut_session_info, a_executable in ut_executable) is
begin
- 440
ut_session_context.set_context( 'current_executable_type', a_executable.executable_type );
- 440
ut_session_context.set_context(
'current_executable_name',
a_executable.owner_name||'.'||a_executable.object_name||'.'||a_executable.procedure_name
);
- 440
dbms_application_info.set_client_info( a_executable.procedure_name );
end;
member procedure after_calling_executable(self in out nocopy ut_session_info, a_executable in ut_executable) is
begin
- 440
ut_session_context.clear_context( 'current_executable_type' );
- 440
ut_session_context.clear_context( 'current_executable_name' );
- 440
dbms_application_info.set_client_info( null );
end;
member procedure on_finalize(self in out nocopy ut_session_info, a_run in ut_run) is
begin
- 116
dbms_application_info.set_client_info( client_info );
- 116
dbms_application_info.set_module( module, action );
- 117
ut_session_context.clear_all_context();
end;
overriding member function get_supported_events return ut_varchar2_list is
begin
- 116
return ut_varchar2_list(
ut_event_manager.gc_before_run,
ut_event_manager.gc_before_suite,
ut_event_manager.gc_before_test,
ut_event_manager.gc_before_before_all,
ut_event_manager.gc_before_before_each,
ut_event_manager.gc_before_before_test,
ut_event_manager.gc_before_test_execute,
ut_event_manager.gc_before_after_test,
ut_event_manager.gc_before_after_each,
ut_event_manager.gc_before_after_all,
ut_event_manager.gc_after_run,
ut_event_manager.gc_after_suite,
ut_event_manager.gc_after_test,
ut_event_manager.gc_after_before_all,
ut_event_manager.gc_after_before_each,
ut_event_manager.gc_after_before_test,
ut_event_manager.gc_after_test_execute,
ut_event_manager.gc_after_after_test,
ut_event_manager.gc_after_after_each,
ut_event_manager.gc_after_after_all,
ut_event_manager.gc_finalize
);
end;
overriding member procedure on_event( self in out nocopy ut_session_info, a_event_name varchar2, a_event_item ut_event_item) is
begin
- 2530
case
- 2530
when a_event_name in (
ut_event_manager.gc_before_before_all,
- 1
ut_event_manager.gc_before_before_each,
- 1
ut_event_manager.gc_before_before_test,
- 1
ut_event_manager.gc_before_test_execute,
- 1
ut_event_manager.gc_before_after_test,
- 1
ut_event_manager.gc_before_after_each,
- 1
ut_event_manager.gc_before_after_all
)
- 440
then before_calling_executable(treat(a_event_item as ut_executable));
- 2090
when a_event_name in (
ut_event_manager.gc_after_before_all,
- 1
ut_event_manager.gc_after_before_each,
- 1
ut_event_manager.gc_after_before_test,
- 1
ut_event_manager.gc_after_test_execute,
- 1
ut_event_manager.gc_after_after_test,
- 1
ut_event_manager.gc_after_after_each,
- 1
ut_event_manager.gc_after_after_all
)
- 440
then after_calling_executable(treat(a_event_item as ut_executable));
- 1650
when a_event_name = ut_event_manager.gc_before_test
- 319
then self.before_calling_test(treat(a_event_item as ut_test));
- 1331
when a_event_name = ut_event_manager.gc_after_test
- 319
then self.after_calling_test(treat(a_event_item as ut_test));
- 1012
when a_event_name = ut_event_manager.gc_after_suite
- 333
then after_calling_suite(treat(a_event_item as ut_logical_suite));
- 679
when a_event_name = ut_event_manager.gc_before_suite
- 333
then before_calling_suite(treat(a_event_item as ut_logical_suite));
- 346
when a_event_name = ut_event_manager.gc_before_run
- 115
then before_calling_run(treat(a_event_item as ut_run));
- 231
when a_event_name = ut_event_manager.gc_after_run
- 115
then after_calling_run(treat(a_event_item as ut_run));
- 116
when a_event_name = ut_event_manager.gc_finalize
- 116
then on_finalize(treat(a_event_item as ut_run));
else null;
end case;
end;
end;
UT3.UT_CONSOLE_REPORTER_BASE
100 % lines covered
5 relevant lines. 5 lines covered and 0 lines missed
type body ut_console_reporter_base is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
static procedure set_color_enabled(a_flag boolean) is
begin
- 116
ut_ansiconsole_helper.color_enabled(a_flag);
end;
member procedure print_red_text(self in out nocopy ut_console_reporter_base, a_text varchar2) is
begin
- 207
self.print_text(ut_ansiconsole_helper.red(a_text));
end;
member procedure print_green_text(self in out nocopy ut_console_reporter_base, a_text varchar2) is
begin
- 180
self.print_text(ut_ansiconsole_helper.green(a_text));
end;
member procedure print_yellow_text(self in out nocopy ut_console_reporter_base, a_text varchar2) is
begin
- 1
self.print_text(ut_ansiconsole_helper.yellow(a_text));
end;
member procedure print_cyan_text(self in out nocopy ut_console_reporter_base, a_text varchar2) is
begin
- 10
self.print_text(ut_ansiconsole_helper.cyan(a_text));
end;
end;
UT3.UT_EXECUTABLE
92.75 % lines covered
69 relevant lines. 64 lines covered and 5 lines missed
type body ut_executable is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_executable(
self in out nocopy ut_executable, a_owner varchar2, a_package varchar2,
a_procedure_name varchar2, a_executable_type varchar2
) return self as result is
begin
- 848
self.self_type := $$plsql_unit;
- 848
self.executable_type := a_executable_type;
- 848
self.owner_name := a_owner;
- 848
self.object_name := a_package;
- 848
self.procedure_name := a_procedure_name;
- 848
return;
end;
member function form_name(a_skip_current_user_schema boolean := false) return varchar2 is
- 563
l_owner_name varchar2(250) := owner_name;
begin
- 563
if a_skip_current_user_schema and sys_context('userenv', 'current_schema') = owner_name then
- 379
l_owner_name := null;
end if;
- 563
return ut_metadata.form_name(l_owner_name, object_name, procedure_name);
end;
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item) is
l_completed_without_errors boolean;
begin
- 396
l_completed_without_errors := self.do_execute(a_item);
end do_execute;
- 505
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item) return boolean is
l_statement varchar2(4000);
l_status number;
l_cursor_number number;
- 505
l_completed_without_errors boolean := true;
- 505
l_failed_with_invalid_pck boolean := true;
l_start_transaction_id varchar2(250);
l_end_transaction_id varchar2(250);
function is_defined return boolean is
- 505
l_result boolean := false;
- 505
l_message_part varchar2(4000) := 'Call params for ' || self.executable_type || ' are not valid: ';
begin
- 505
if self.object_name is null then
- 1
self.error_stack := l_message_part || 'package is not defined';
- 504
elsif self.procedure_name is null then
- 5
self.error_stack := l_message_part || 'procedure is not defined';
else
- 499
l_result := true;
end if;
- 505
return l_result;
end is_defined;
function is_invalid return boolean is
- 12
l_result boolean := true;
- 12
l_message_part varchar2(4000) := 'Call params for ' || self.executable_type || ' are not valid: ';
begin
- 12
if not ut_metadata.package_valid(self.owner_name, self.object_name) then
- 6
self.error_stack := l_message_part || 'package '||upper(self.owner_name||'.'||self.object_name)||' does not exist or is invalid.';
- 6
elsif not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then
- 6
self.error_stack := l_message_part || 'procedure '||upper(self.owner_name || '.' || self.object_name || '.' ||self.procedure_name)||' does not exist.';
else
l_result := false;
end if;
- 12
return l_result;
end is_invalid;
procedure save_dbms_output is
l_status number;
l_line varchar2(32767);
begin
- 499
dbms_output.get_line(line => l_line, status => l_status);
- 499
if l_status != 1 then
- 326
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
end if;
- 951
while l_status != 1 loop
- 452
if l_line is not null then
- 451
ut_utils.append_to_clob(self.serveroutput, l_line||chr(10));
end if;
- 452
dbms_output.get_line(line => l_line, status => l_status);
end loop;
end save_dbms_output;
begin
- 505
l_start_transaction_id := dbms_transaction.local_transaction_id(true);
--listener - before call to executable
- 505
ut_event_manager.trigger_event('before_'||self.executable_type, self);
- 505
l_completed_without_errors := is_defined();
- 505
if l_completed_without_errors then
- 499
l_statement :=
'declare' || chr(10) ||
' l_error_stack varchar2(32767);' || chr(10) ||
' l_error_backtrace varchar2(32767);' || chr(10) ||
'begin' || chr(10) ||
' begin' || chr(10) ||
' ' || self.form_name( a_skip_current_user_schema => true ) || ';' || chr(10) ||
' exception' || chr(10) ||
' when others then ' || chr(10) ||
' l_error_stack := dbms_utility.format_error_stack;' || chr(10) ||
' l_error_backtrace := dbms_utility.format_error_backtrace;' || chr(10) ||
' --raise on ORA-04068, ORA-04061: existing state of packages has been discarded to avoid unrecoverable session exception' || chr(10) ||
' end;' || chr(10) ||
' :a_error_stack := l_error_stack;' || chr(10) ||
' :a_error_backtrace := l_error_backtrace;' || chr(10) ||
'end;';
- 499
ut_utils.debug_log('ut_executable.do_execute l_statement: ' || l_statement);
- 499
l_cursor_number := dbms_sql.open_cursor;
/**
* The code will allow to execute once we check if packages are defined
* If it fail with 6550 (usually invalid package) it will check if because of invalid state or missing
* if for any other reason we will propagate it up as we didnt expected.
**/
begin
- 499
dbms_sql.parse(l_cursor_number, statement => l_statement, language_flag => dbms_sql.native);
- 492
dbms_sql.bind_variable(l_cursor_number, 'a_error_stack', to_char(null), 32767);
- 492
dbms_sql.bind_variable(l_cursor_number, 'a_error_backtrace', to_char(null), 32767);
- 492
l_status := dbms_sql.execute(l_cursor_number);
- 487
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', self.error_stack);
- 487
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', self.error_backtrace);
- 487
dbms_sql.close_cursor(l_cursor_number);
exception
- 24
when ut_utils.ex_invalid_package then
- 12
l_failed_with_invalid_pck := is_invalid();
- 12
dbms_sql.close_cursor(l_cursor_number);
- 12
if not l_failed_with_invalid_pck then
raise;
end if;
when others then
dbms_sql.close_cursor(l_cursor_number);
raise;
end;
- 499
save_dbms_output;
- 499
l_completed_without_errors := (self.error_stack||self.error_backtrace) is null;
- 499
if self.error_stack like '%ORA-04068%' or self.error_stack like '%ORA-04061%' then
- 2
ut_expectation_processor.set_invalidation_exception();
end if;
end if;
--listener - after call to executable
- 505
ut_event_manager.trigger_event('after_'||self.executable_type, self);
- 505
l_end_transaction_id := dbms_transaction.local_transaction_id();
- 505
if l_start_transaction_id != l_end_transaction_id or l_end_transaction_id is null then
- 3
a_item.add_transaction_invalidator(self.form_name());
end if;
- 505
return l_completed_without_errors;
end do_execute;
member function get_error_stack_trace return varchar2 is
begin
- 589
return rtrim(self.error_stack||self.error_backtrace, chr(10));
end;
end;
UT3.UT_EXECUTABLE_TEST
96.15 % lines covered
26 relevant lines. 25 lines covered and 1 lines missed
type body ut_executable_test as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_executable_test(
self in out nocopy ut_executable_test, a_owner varchar2, a_package varchar2,
a_procedure_name varchar2, a_executable_type varchar2
) return self as result is
begin
- 2468
self.self_type := $$plsql_unit;
- 2468
self.executable_type := a_executable_type;
- 2468
self.owner_name := a_owner;
- 2468
self.object_name := a_package;
- 2468
self.procedure_name := a_procedure_name;
- 2468
return;
end;
member procedure do_execute(
self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item,
a_expected_error_codes in ut_integer_list
) is
l_completed_without_errors boolean;
begin
- 337
l_completed_without_errors := self.do_execute(a_item, a_expected_error_codes);
end do_execute;
member function do_execute(
self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item,
a_expected_error_codes in ut_integer_list
) return boolean is
l_expected_except_message varchar2(4000);
function failed_expec_errnum_message(a_expected_error_codes in ut_integer_list) return varchar is
l_actual_error_no integer;
l_expected_error_codes varchar2(4000);
l_fail_message varchar2(4000);
begin
--Convert the ut_varchar2_list to string to can construct the message
- 16
l_expected_error_codes := ut_utils.table_to_clob(a_expected_error_codes, ', ');
- 16
if self.error_stack is null then
- 1
l_fail_message := 'Expected one of exceptions ('||l_expected_error_codes||') but nothing was raised.';
else
- 15
l_actual_error_no := regexp_substr(self.error_stack, '^[a-zA-Z]{3}(-[0-9]+)', subexpression=>1);
- 15
if not l_actual_error_no member of a_expected_error_codes then
- 2
l_fail_message := 'Actual: '||l_actual_error_no||' was expected to ';
- 2
if cardinality(a_expected_error_codes) > 1 then
l_fail_message := l_fail_message || 'be one of: ('||l_expected_error_codes||')';
else
- 2
l_fail_message := l_fail_message || 'equal: '||l_expected_error_codes;
end if;
- 2
l_fail_message := substr( l_fail_message||chr(10)||self.error_stack||chr(10)||self.error_backtrace, 1, 4000 );
end if;
end if;
- 16
return l_fail_message;
end;
begin
--Create a ut_executable object and call do_execute after that get the data to know the test's execution result
- 337
self.do_execute(a_item);
- 337
if a_expected_error_codes is not null and a_expected_error_codes is not empty then
- 16
l_expected_except_message := failed_expec_errnum_message(a_expected_error_codes);
- 16
if l_expected_except_message is not null then
- 3
ut_expectation_processor.add_expectation_result(
ut_expectation_result(ut_utils.gc_failure, null, l_expected_except_message, false)
);
end if;
- 16
self.error_stack := null;
- 16
self.error_backtrace := null;
end if;
- 337
return (self.error_stack||self.error_backtrace) is null;
end;
end;
UT3.UT_EXPECTATION_RESULT
93.33 % lines covered
15 relevant lines. 14 lines covered and 1 lines missed
type body ut_expectation_result is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_expectation_result(
self in out nocopy ut_expectation_result, a_status integer,
a_description varchar2, a_message clob, a_include_caller_info boolean := true
) return self as result is
begin
- 799
self.self_type := $$plsql_unit;
- 799
self.status := a_status;
- 799
self.description := a_description;
- 799
self.message := a_message;
- 800
if self.status = ut_utils.gc_failure and a_include_caller_info then
- 427
self.caller_info := ut_expectation_processor.who_called_expectation(dbms_utility.format_call_stack());
end if;
- 799
return;
end;
member function get_result_clob(self in ut_expectation_result) return clob is
l_result clob;
begin
- 33
if self.description is not null then
- 6
ut_utils.append_to_clob(l_result, '"'||self.description||'"');
- 6
if self.message is not null then
- 6
ut_utils.append_to_clob(l_result, chr(10));
end if;
end if;
- 33
ut_utils.append_to_clob(l_result, self.message);
- 33
return l_result;
end;
member function get_result_lines(self in ut_expectation_result) return ut_varchar2_list is
begin
- 33
return ut_utils.clob_to_table(get_result_clob(), 4000 );
end;
member function result return integer is
begin
return self.status;
end;
end;
UT3.UT_FILE_MAPPING
100 % lines covered
2 relevant lines. 2 lines covered and 0 lines missed
type body ut_file_mapping as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 48
map member function pk return varchar2 is
begin
- 48
return object_type||' '||object_owner||'.'||object_name;
end;
end;
UT3.UT_LOGICAL_SUITE
100 % lines covered
42 relevant lines. 42 lines covered and 0 lines missed
type body ut_logical_suite as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
overriding member procedure mark_as_skipped(self in out nocopy ut_logical_suite) is
begin
- 2
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
- 1
self.start_time := current_timestamp;
- 3
for i in 1 .. self.items.count loop
- 2
self.items(i).mark_as_skipped();
end loop;
- 1
self.end_time := self.start_time;
- 1
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
- 1
self.calc_execution_result();
end;
overriding member procedure set_rollback_type(self in out nocopy ut_logical_suite, a_rollback_type integer, a_force boolean := false) is
begin
- 1419
self.rollback_type := case when a_force then a_rollback_type else coalesce(self.rollback_type, a_rollback_type) end;
- 3289
for i in 1 .. self.items.count loop
- 1870
self.items(i).set_rollback_type(self.rollback_type, a_force);
end loop;
end;
overriding member function do_execute(self in out nocopy ut_logical_suite) return boolean is
l_suite_savepoint varchar2(30);
l_item_savepoint varchar2(30);
l_completed_without_errors boolean;
begin
- 141
ut_utils.debug_log('ut_logical_suite.execute');
- 141
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
- 141
self.start_time := current_timestamp;
- 285
for i in 1 .. self.items.count loop
-- execute the item (test or suite)
- 144
self.items(i).do_execute();
end loop;
- 141
self.calc_execution_result();
- 141
self.end_time := current_timestamp;
- 141
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
- 141
return l_completed_without_errors;
end;
overriding member procedure calc_execution_result(self in out nocopy ut_logical_suite) is
l_result integer(1);
begin
- 347
if self.items is not null and self.items.count > 0 then
- 876
for i in 1 .. self.items.count loop
- 531
self.results_count.sum_counter_values( self.items(i).results_count );
end loop;
- 345
l_result := self.results_count.result_status();
else
--if suite is empty then it's successful (no errors)
- 2
l_result := ut_utils.gc_success;
end if;
- 347
self.result := l_result;
end;
overriding member procedure mark_as_errored(self in out nocopy ut_logical_suite, a_error_stack_trace varchar2) is
begin
- 2
ut_utils.debug_log('ut_logical_suite.fail');
- 2
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
- 2
self.start_time := current_timestamp;
- 4
for i in 1 .. self.items.count loop
-- execute the item (test or suite)
- 2
self.items(i).mark_as_errored(a_error_stack_trace);
end loop;
- 2
self.calc_execution_result();
- 2
self.end_time := self.start_time;
- 2
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
end;
overriding member function get_error_stack_traces return ut_varchar2_list is
begin
- 1
return ut_varchar2_list();
end;
overriding member function get_serveroutputs return clob is
begin
- 1
return null;
end;
overriding member function get_transaction_invalidators return ut_varchar2_list is
l_result ut_varchar2_list;
l_child_results ut_varchar2_list;
begin
- 3
l_result := self.transaction_invalidators;
- 5
for i in 1 .. self.items.count loop
- 2
l_child_results := self.items(i).get_transaction_invalidators();
- 4
for j in 1 .. l_child_results.count loop
- 2
if l_child_results(j) not member of l_result then
- 4
l_result.extend; l_result(l_result.last) := l_child_results(j);
end if;
end loop;
end loop;
- 3
return l_result;
end;
end;
UT3.UT_OBJECT_NAME
90 % lines covered
10 relevant lines. 9 lines covered and 1 lines missed
type body ut_object_name as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_object_name(self in out nocopy ut_object_name, owner varchar2, name varchar2) return self as result is
begin
- 2545
self.owner := upper(owner);
- 2545
self.name := upper(name);
- 2545
return;
end;
constructor function ut_object_name(self in out nocopy ut_object_name, a_unit_name varchar2) return self as result is
begin
- 3
if instr(a_unit_name,'.') > 0 then
- 3
self.owner := upper(regexp_substr(a_unit_name,'[^\.]+', 1, 1));
- 3
self.name := upper(regexp_substr(a_unit_name,'[^\.]+', 1, 2));
else
self.name := upper(a_unit_name);
end if;
- 3
return;
end;
- 1
map member function identity return varchar2 is
begin
- 1
return owner||'.'||name;
end;
end;
UT3.UT_OUTPUT_REPORTER_BASE
75 % lines covered
20 relevant lines. 15 lines covered (including 1 lines partially covered ) and 5 lines missed
type body ut_output_reporter_base is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_output_reporter_base(self in out nocopy ut_output_reporter_base) return self as result is
begin
return;
end;
member procedure init(self in out nocopy ut_output_reporter_base, a_self_type varchar2, a_output_buffer ut_output_buffer_base := null) is
begin
- 117
(self as ut_reporter_base).init(a_self_type);
- 117
self.output_buffer := coalesce(a_output_buffer, ut_output_table_buffer());
- 117
self.set_reporter_id(self.output_buffer.output_id);
end;
overriding member procedure set_reporter_id(self in out nocopy ut_output_reporter_base, a_reporter_id raw) is
begin
- 117
self.id := a_reporter_id;
- 117
self.output_buffer.init(a_reporter_id);
end;
member function set_reporter_id(self in ut_output_reporter_base, a_reporter_id raw) return ut_output_reporter_base is
l_result ut_output_reporter_base := self;
begin
l_result.set_reporter_id(a_reporter_id);
return l_result;
end;
overriding member procedure before_calling_run(self in out nocopy ut_output_reporter_base, a_run in ut_run) is
l_output_table_buffer ut_output_table_buffer;
begin
- 113
(self as ut_reporter_base).before_calling_run(a_run);
- 113
l_output_table_buffer := treat(self.output_buffer as ut_output_table_buffer);
end;
member procedure print_text(self in out nocopy ut_output_reporter_base, a_text varchar2, a_item_type varchar2 := null) is
begin
- 1691
self.output_buffer.send_line(a_text, a_item_type);
end;
member procedure print_text_lines(self in out nocopy ut_output_reporter_base, a_text_lines ut_varchar2_rows, a_item_type varchar2 := null) is
begin
- 333
self.output_buffer.send_lines(a_text_lines, a_item_type);
end;
member procedure print_clob(self in out nocopy ut_output_reporter_base, a_clob clob, a_item_type varchar2 := null) is
begin
- 30
self.output_buffer.send_clob( a_clob, a_item_type );
end;
final member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural) return ut_output_data_rows pipelined is
begin
- 1/2 32
for i in (select value(x) val from table(self.output_buffer.get_lines(a_initial_timeout, a_timeout_sec)) x ) loop
pipe row (i.val);
end loop;
end;
final member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural) return sys_refcursor is
begin
- 81
return self.output_buffer.get_lines_cursor(a_initial_timeout, a_timeout_sec);
end;
final member procedure lines_to_dbms_output(self in ut_output_reporter_base, a_initial_timeout natural := null, a_timeout_sec natural) is
begin
- 32
self.output_buffer.lines_to_dbms_output(a_initial_timeout, a_timeout_sec);
end;
overriding final member procedure on_finalize(self in out nocopy ut_output_reporter_base, a_run in ut_run) is
begin
- 116
self.output_buffer.close();
end;
overriding member procedure on_initialize(self in out nocopy ut_output_reporter_base, a_run in ut_run) is
begin
- 116
self.output_buffer.send_line(null, 'initialize');
end;
end;
UT3.UT_REPORTER_BASE
94.52 % lines covered
73 relevant lines. 69 lines covered and 4 lines missed
type body ut_reporter_base is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
final member procedure init(self in out nocopy ut_reporter_base, a_self_type varchar2) is
begin
- 117
self.self_type := a_self_type;
- 117
self.id := sys_guid();
- 117
return;
end;
member procedure set_reporter_id(self in out nocopy ut_reporter_base, a_reporter_id raw) is
begin
self.id := a_reporter_id;
end;
member function get_reporter_id return raw is
begin
return self.id;
end;
member function get_description return varchar2 is
begin
return 'No description available';
end;
-- run hooks
member procedure before_calling_run(self in out nocopy ut_reporter_base, a_run in ut_run) is
begin
- 113
null;
end;
-- suite hooks
member procedure before_calling_suite(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
begin
- 107
null;
end;
member procedure before_calling_before_all(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 14
null;
end;
member procedure after_calling_before_all (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 7
null;
end;
member procedure before_calling_before_each(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 24
null;
end;
member procedure after_calling_before_each (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 24
null;
end;
-- test hooks
member procedure before_calling_test(self in out nocopy ut_reporter_base, a_test in ut_test) is
begin
- 301
null;
end;
member procedure before_calling_before_test(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 23
null;
end;
member procedure after_calling_before_test (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 23
null;
end;
member procedure before_calling_test_execute(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 291
null;
end;
member procedure after_calling_test_execute (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 291
null;
end;
member procedure before_calling_after_test(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 10
null;
end;
member procedure after_calling_after_test (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 10
null;
end;
member procedure after_calling_test(self in out nocopy ut_reporter_base, a_test in ut_test) is
begin
- 85
null;
end;
--suite hooks continued
member procedure before_calling_after_each(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 31
null;
end;
member procedure after_calling_after_each (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 31
null;
end;
member procedure before_calling_after_all(self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 12
null;
end;
member procedure after_calling_after_all (self in out nocopy ut_reporter_base, a_executable in ut_executable) is
begin
- 7
null;
end;
member procedure after_calling_suite(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
begin
- 107
null;
end;
-- run hooks continued
member procedure after_calling_run (self in out nocopy ut_reporter_base, a_run in ut_run) is
begin
- 75
null;
end;
overriding member function get_supported_events return ut_varchar2_list is
begin
- 115
return ut_varchar2_list(
ut_event_manager.gc_initialize,
ut_event_manager.gc_before_run,
ut_event_manager.gc_before_suite,
ut_event_manager.gc_before_test,
ut_event_manager.gc_before_before_all,
ut_event_manager.gc_before_before_each,
ut_event_manager.gc_before_before_test,
ut_event_manager.gc_before_test_execute,
ut_event_manager.gc_before_after_test,
ut_event_manager.gc_before_after_each,
ut_event_manager.gc_before_after_all,
ut_event_manager.gc_after_run,
ut_event_manager.gc_after_suite,
ut_event_manager.gc_after_test,
ut_event_manager.gc_after_before_all,
ut_event_manager.gc_after_before_each,
ut_event_manager.gc_after_before_test,
ut_event_manager.gc_after_test_execute,
ut_event_manager.gc_after_after_test,
ut_event_manager.gc_after_after_each,
ut_event_manager.gc_after_after_all,
ut_event_manager.gc_finalize
);
end;
overriding member procedure on_event( self in out nocopy ut_reporter_base, a_event_name varchar2, a_event_item ut_event_item) is
begin
- 2596
case a_event_name
- 2596
when ut_event_manager.gc_initialize
- 115
then self.on_initialize(treat(a_event_item as ut_run));
- 2481
when ut_event_manager.gc_before_run
- 114
then self.before_calling_run(treat(a_event_item as ut_run));
- 2367
when ut_event_manager.gc_before_suite
- 327
then self.before_calling_suite(treat(a_event_item as ut_logical_suite));
- 2040
when ut_event_manager.gc_before_before_all
- 15
then self.before_calling_before_all(treat(a_event_item as ut_executable));
- 2025
when ut_event_manager.gc_before_before_each
- 27
then self.before_calling_before_each(treat(a_event_item as ut_executable));
- 1998
when ut_event_manager.gc_before_test
- 315
then self.before_calling_test(treat(a_event_item as ut_test));
- 1683
when ut_event_manager.gc_before_before_test
- 24
then self.before_calling_before_test(treat(a_event_item as ut_executable));
- 1659
when ut_event_manager.gc_before_test_execute
- 303
then self.before_calling_test_execute(treat(a_event_item as ut_executable));
- 1356
when ut_event_manager.gc_before_after_test
- 11
then self.before_calling_after_test(treat(a_event_item as ut_executable));
- 1345
when ut_event_manager.gc_before_after_each
- 34
then self.before_calling_after_each(treat(a_event_item as ut_executable));
- 1311
when ut_event_manager.gc_before_after_all
- 13
then self.before_calling_after_all(treat(a_event_item as ut_executable));
- 1298
when ut_event_manager.gc_after_run
- 114
then self.after_calling_run(treat(a_event_item as ut_run));
- 1184
when ut_event_manager.gc_after_suite
- 327
then self.after_calling_suite(treat(a_event_item as ut_logical_suite));
- 857
when ut_event_manager.gc_after_before_all
- 15
then self.after_calling_before_all(treat(a_event_item as ut_executable));
- 842
when ut_event_manager.gc_after_before_each
- 27
then self.after_calling_before_each(treat(a_event_item as ut_executable));
- 815
when ut_event_manager.gc_after_test
- 315
then self.after_calling_test(treat(a_event_item as ut_test));
- 500
when ut_event_manager.gc_after_before_test
- 24
then self.after_calling_before_test(treat(a_event_item as ut_executable));
- 476
when ut_event_manager.gc_after_test_execute
- 303
then self.after_calling_test_execute(treat(a_event_item as ut_executable));
- 173
when ut_event_manager.gc_after_after_test
- 11
then self.after_calling_after_test(treat(a_event_item as ut_executable));
- 162
when ut_event_manager.gc_after_after_each
- 34
then self.after_calling_after_each(treat(a_event_item as ut_executable));
- 128
when ut_event_manager.gc_after_after_all
- 13
then self.after_calling_after_all(treat(a_event_item as ut_executable));
- 115
when ut_event_manager.gc_finalize
- 115
then self.on_finalize(treat(a_event_item as ut_run));
else null;
end case;
end;
end;
UT3.UT_RESULTS_COUNTER
100 % lines covered
27 relevant lines. 27 lines covered and 0 lines missed
type body ut_results_counter as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_results_counter(self in out nocopy ut_results_counter) return self as result is
begin
- 4201
self.disabled_count := 0;
- 4201
self.success_count := 0;
- 4201
self.failure_count := 0;
- 4201
self.errored_count := 0;
- 4201
self.warnings_count := 0;
- 4201
return;
end;
member procedure set_counter_values(self in out nocopy ut_results_counter, a_status integer) is
begin
- 361
self.disabled_count := case when a_status = ut_utils.gc_disabled then 1 else 0 end;
- 360
self.success_count := case when a_status = ut_utils.gc_success then 1 else 0 end;
- 360
self.failure_count := case when a_status = ut_utils.gc_failure then 1 else 0 end;
- 360
self.errored_count := case when a_status = ut_utils.gc_error then 1 else 0 end;
end;
member procedure sum_counter_values(self in out nocopy ut_results_counter, a_item ut_results_counter) is
begin
- 673
self.disabled_count := self.disabled_count + a_item.disabled_count;
- 673
self.success_count := self.success_count + a_item.success_count;
- 673
self.failure_count := self.failure_count + a_item.failure_count;
- 673
self.errored_count := self.errored_count + a_item.errored_count;
- 673
self.warnings_count := self.warnings_count + a_item.warnings_count;
end;
member procedure increase_warning_count(self in out nocopy ut_results_counter, a_count integer := 1) is
begin
- 409
self.warnings_count := self.warnings_count + nvl(a_count,0);
end;
member function total_count return integer is
begin
--skip warnings here
- 70
return self.disabled_count + self.success_count + self.failure_count + self.errored_count;
end;
member function result_status return integer is
l_result integer;
begin
- 459
if self.errored_count > 0 then
- 208
l_result := ut_utils.gc_error;
- 251
elsif self.failure_count > 0 then
- 46
l_result := ut_utils.gc_failure;
- 205
elsif self.success_count > 0 then
- 200
l_result := ut_utils.gc_success;
- 5
elsif self.disabled_count > 0 then
- 1
l_result := ut_utils.gc_disabled;
else
- 4
l_result := ut_utils.gc_error;
end if;
- 459
return l_result;
end;
end;
UT3.UT_RUN
93.94 % lines covered
33 relevant lines. 31 lines covered (including 1 lines partially covered ) and 2 lines missed
type body ut_run as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_run(
self in out nocopy ut_run,
a_items ut_suite_items,
a_run_paths ut_varchar2_list := null,
a_schema_names ut_varchar2_rows := null,
a_exclude_objects ut_object_names := null,
a_include_objects ut_object_names := null,
a_project_file_mappings ut_file_mappings := null,
a_test_file_mappings ut_file_mappings := null,
a_client_character_set varchar2 := null,
a_random_test_order_seed positive := null,
a_run_tags ut_varchar2_rows := null
) return self as result is
begin
- 116
self.run_paths := a_run_paths;
- 116
self.run_tags := a_run_tags;
- 116
self.self_type := $$plsql_unit;
- 116
self.items := a_items;
- 116
self.client_character_set := lower(a_client_character_set);
- 116
self.random_test_order_seed := a_random_test_order_seed;
- 116
self.results_count := ut_results_counter();
- 116
self.test_file_mappings := coalesce(a_test_file_mappings, ut_file_mappings());
- 116
self.coverage_options := ut_coverage_options(
a_schema_names,
a_exclude_objects,
a_include_objects,
a_project_file_mappings
);
- 116
return;
end;
overriding member procedure mark_as_skipped(self in out nocopy ut_run) is
begin
null;
end;
overriding member function do_execute(self in out nocopy ut_run) return boolean is
l_completed_without_errors boolean;
begin
- 115
ut_utils.debug_log('ut_run.execute');
- 116
ut_event_manager.trigger_event(ut_event_manager.gc_before_run, self);
- 115
self.start_time := current_timestamp;
-- clear anything that might stay in the session's cache
- 116
ut_expectation_processor.clear_expectations;
- 257
for i in 1 .. self.items.count loop
- 142
l_completed_without_errors := self.items(i).do_execute();
end loop;
- 115
self.calc_execution_result();
- 115
self.end_time := current_timestamp;
- 115
ut_event_manager.trigger_event(ut_event_manager.gc_after_run, self);
- 115
return l_completed_without_errors;
end;
overriding member procedure set_rollback_type(self in out nocopy ut_run, a_rollback_type integer, a_force boolean := false) is
begin
- 2/4 2
self.rollback_type := case when a_force then a_rollback_type else coalesce(self.rollback_type, a_rollback_type) end;
- 4
for i in 1 .. self.items.count loop
- 2
self.items(i).set_rollback_type(self.rollback_type, a_force);
end loop;
end;
overriding member procedure calc_execution_result(self in out nocopy ut_run) is
l_result integer(1);
begin
- 115
if self.items is not null and self.items.count > 0 then
- 256
for i in 1 .. self.items.count loop
- 142
self.results_count.sum_counter_values( self.items(i).results_count );
end loop;
- 114
l_result := self.results_count.result_status();
else
--if suite is empty then it's successful (no errors)
- 1
l_result := ut_utils.gc_success;
end if;
- 115
self.result := l_result;
end;
overriding member procedure mark_as_errored(self in out nocopy ut_run, a_error_stack_trace varchar2) is
begin
null;
end;
overriding member function get_error_stack_traces return ut_varchar2_list is
begin
- 1
return ut_varchar2_list();
end;
overriding member function get_serveroutputs return clob is
begin
- 1
return null;
end;
end;
UT3.UT_RUN_INFO
100 % lines covered
10 relevant lines. 10 lines covered and 0 lines missed
type body ut_run_info as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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 andTEST_GET_REPORTERS_LIST
limitations under the License.
*/
constructor function ut_run_info(self in out nocopy ut_run_info) return self as result is
- 116
l_ut_owner varchar2(250) := ut_utils.ut_owner;
begin
- 116
self.self_type := $$plsql_unit;
- 116
execute immediate
'select '||l_ut_owner||'.ut.version() from dual'
into self.ut_version;
- 116
dbms_utility.db_version( self.db_version, self.db_compatibility );
- 116
db_os_type := dbms_utility.port_string();
- 116
execute immediate
'select '||l_ut_owner||'.ut_key_value_pair(x.product, x.version) from product_component_version x'
bulk collect into self.db_component_version;
- 116
execute immediate
'select '||l_ut_owner||'.ut_key_value_pair(x.parameter, x.value)
from nls_session_parameters x'
bulk collect into self.nls_session_params;
- 116
execute immediate
'select '||l_ut_owner||'.ut_key_value_pair(x.parameter, x.value) from nls_instance_parameters x'
bulk collect into self.nls_instance_params;
- 116
execute immediate
'select '||l_ut_owner||'.ut_key_value_pair(x.parameter, x.value) from nls_database_parameters x'
bulk collect into self.nls_db_params;
- 116
return;
end;
end;
UT3.UT_SUITE
100 % lines covered
44 relevant lines. 44 lines covered and 0 lines missed
type body ut_suite as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_suite (
self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer,
a_tags ut_varchar2_rows := null
) return self as result is
begin
- 284
self.self_type := $$plsql_unit;
- 284
self.init(a_object_owner, a_object_name, a_object_name, a_line_no);
- 284
self.items := ut_suite_items();
- 284
before_all_list := ut_executables();
- 284
after_all_list := ut_executables();
- 284
self.tags := coalesce(a_tags,ut_varchar2_rows());
- 284
return;
end;
overriding member function do_execute(self in out nocopy ut_suite) return boolean is
l_suite_savepoint varchar2(30);
l_no_errors boolean;
procedure propagate_error(a_error_stack_trace varchar2) is
begin
- 4
for i in 1..self.items.count loop
- 2
self.items(i).mark_as_errored(a_error_stack_trace);
end loop;
end;
begin
- 204
ut_utils.debug_log('ut_suite.execute');
- 204
if self.get_disabled_flag() then
- 1
self.mark_as_skipped();
else
- 203
self.start_time := current_timestamp;
- 204
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
- 203
l_suite_savepoint := self.create_savepoint_if_needed();
--includes listener calls for before and after actions
- 203
l_no_errors := true;
- 227
for i in 1 .. self.before_all_list.count loop
- 26
l_no_errors := self.before_all_list(i).do_execute(self);
- 26
if not l_no_errors then
- 2
propagate_error(self.before_all_list(i).get_error_stack_trace());
- 2
exit;
end if;
end loop;
- 203
if l_no_errors then
- 582
for i in 1 .. self.items.count loop
- 381
self.items(i).do_execute();
end loop;
end if;
- 218
for i in 1 .. after_all_list.count loop
- 15
l_no_errors := self.after_all_list(i).do_execute(self);
- 15
if not l_no_errors then
- 2
self.put_warning(self.after_all_list(i).get_error_stack_trace());
end if;
end loop;
- 203
self.rollback_to_savepoint(l_suite_savepoint);
- 203
self.calc_execution_result();
- 203
self.end_time := current_timestamp;
- 203
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
end if;
- 204
return l_no_errors;
end;
overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list is
- 29
l_stack_traces ut_varchar2_list := ut_varchar2_list();
begin
- 33
for i in 1 .. before_all_list.count loop
- 4
ut_utils.append_to_list(l_stack_traces, self.before_all_list(i).get_error_stack_trace());
end loop;
- 33
for i in 1 .. after_all_list.count loop
- 4
ut_utils.append_to_list(l_stack_traces, self.after_all_list(i).get_error_stack_trace());
end loop;
- 29
return l_stack_traces;
end;
overriding member function get_serveroutputs return clob is
l_outputs clob;
begin
- 35
for i in 1 .. before_all_list.count loop
- 5
ut_utils.append_to_clob(l_outputs, self.before_all_list(i).serveroutput);
end loop;
- 35
for i in 1 .. after_all_list.count loop
- 5
ut_utils.append_to_clob(l_outputs, self.after_all_list(i).serveroutput);
end loop;
- 30
return l_outputs;
end;
end;
UT3.UT_SUITE_CONTEXT
100 % lines covered
6 relevant lines. 6 lines covered and 0 lines missed
type body ut_suite_context as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_suite_context (
self in out nocopy ut_suite_context, a_object_owner varchar2, a_object_name varchar2, a_context_name varchar2 := null, a_line_no integer
) return self as result is
begin
- 176
self.self_type := $$plsql_unit;
- 176
self.init(a_object_owner, a_object_name, a_context_name, a_line_no);
- 176
self.items := ut_suite_items();
- 176
before_all_list := ut_executables();
- 176
after_all_list := ut_executables();
- 176
return;
end;
end;
UT3.UT_SUITE_ITEM
100 % lines covered
33 relevant lines. 33 lines covered and 0 lines missed
type body ut_suite_item as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_suite_item, a_object_owner varchar2, a_object_name varchar2, a_name varchar2, a_line_no integer) is
begin
- 2921
self.object_owner := a_object_owner;
- 2921
self.object_name := lower(trim(a_object_name));
- 2921
self.name := lower(trim(a_name));
- 2921
self.results_count := ut_results_counter();
- 2921
self.warnings := ut_varchar2_rows();
- 2921
self.line_no := a_line_no;
- 2921
self.transaction_invalidators := ut_varchar2_list();
- 2921
self.disabled_flag := ut_utils.boolean_to_int(false);
end;
member function get_disabled_flag return boolean is
begin
- 569
return ut_utils.int_to_boolean(self.disabled_flag);
end;
member procedure set_rollback_type(self in out nocopy ut_suite_item, a_rollback_type integer, a_force boolean := false) is
begin
- 1315
self.rollback_type := case when a_force then a_rollback_type else coalesce(self.rollback_type, a_rollback_type) end;
end;
member function get_rollback_type return integer is
begin
- 1512
return nvl(self.rollback_type, ut_utils.gc_rollback_default);
end;
final member procedure do_execute(self in out nocopy ut_suite_item) is
l_completed_without_errors boolean;
begin
- 674
l_completed_without_errors := self.do_execute();
end;
member function create_savepoint_if_needed return varchar2 is
l_savepoint varchar2(30);
begin
- 548
if get_rollback_type() = ut_utils.gc_rollback_auto then
- 321
l_savepoint := ut_utils.gen_savepoint_name();
- 321
execute immediate 'savepoint ' || l_savepoint;
end if;
- 548
return l_savepoint;
end;
member procedure rollback_to_savepoint(self in out nocopy ut_suite_item, a_savepoint varchar2) is
ex_savepoint_not_exists exception;
l_transaction_invalidators clob;
pragma exception_init(ex_savepoint_not_exists, -1086);
l_savepoint varchar2(250);
begin
- 549
if get_rollback_type() = ut_utils.gc_rollback_auto and a_savepoint is not null then
- 322
l_savepoint := sys.dbms_assert.qualified_sql_name(a_savepoint);
- 322
execute immediate 'rollback to ' || l_savepoint;
end if;
exception
- 12
when ex_savepoint_not_exists then
- 6
l_transaction_invalidators :=
lower( ut_utils.indent_lines( ut_utils.table_to_clob( self.get_transaction_invalidators() ), 2, true ) );
- 6
if length(l_transaction_invalidators) > 3000 then
- 1
l_transaction_invalidators := substr(l_transaction_invalidators,1,3000)||'...';
end if;
- 6
put_warning(
'Unable to perform automatic rollback after test'
- 1
|| case when self_type like '%SUITE' then ' suite' when self_type like '%CONTEXT' then ' context' end || '. '
||'An implicit or explicit commit/rollback occurred in procedures:'||chr(10)
||l_transaction_invalidators||chr(10)
||'Use the "--%rollback(manual)" annotation or remove commit/rollback/ddl statements that are causing the issue.'
);
end;
member function execution_time return number is
begin
- 424
return ut_utils.time_diff(start_time, end_time);
end;
member procedure put_warning(self in out nocopy ut_suite_item, a_message varchar2) is
begin
- 62
self.warnings.extend;
- 62
self.warnings(self.warnings.last) := a_message;
- 62
self.results_count.increase_warning_count;
end;
member function get_transaction_invalidators return ut_varchar2_list is
begin
- 5
return transaction_invalidators;
end;
member procedure add_transaction_invalidator(self in out nocopy ut_suite_item, a_object_name varchar2) is
begin
- 103
if a_object_name not member of transaction_invalidators then
- 103
transaction_invalidators.extend();
- 103
transaction_invalidators(transaction_invalidators.last) := a_object_name;
end if;
end;
end;
UT3.UT_TEST
100 % lines covered
87 relevant lines. 87 lines covered and 0 lines missed
type body ut_test as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_test(
self in out nocopy ut_test, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2,
a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags ut_varchar2_rows := null
) return self as result is
begin
- 2461
self.self_type := $$plsql_unit;
- 2461
self.init(a_object_owner, a_object_name, a_name, a_line_no);
- 2461
self.item := ut_executable_test(a_object_owner, a_object_name, a_name, ut_utils.gc_test_execute);
- 2461
self.before_each_list := ut_executables();
- 2461
self.before_test_list := ut_executables();
- 2461
self.after_test_list := ut_executables();
- 2461
self.after_each_list := ut_executables();
- 2461
self.all_expectations := ut_expectation_results();
- 2461
self.failed_expectations := ut_expectation_results();
- 2461
self.expected_error_codes := a_expected_error_codes;
- 2461
self.tags := coalesce(a_tags,ut_varchar2_rows());
- 2461
return;
end;
overriding member procedure mark_as_skipped(self in out nocopy ut_test) is
begin
- 13
ut_event_manager.trigger_event(ut_event_manager.gc_before_test, self);
- 13
self.start_time := current_timestamp;
- 13
self.result := ut_utils.gc_disabled;
- 13
ut_utils.debug_log('ut_test.execute - disabled');
- 13
self.results_count.set_counter_values(self.result);
- 13
self.end_time := self.start_time;
- 13
ut_event_manager.trigger_event(ut_event_manager.gc_after_test, self);
end;
overriding member function do_execute(self in out nocopy ut_test) return boolean is
l_no_errors boolean;
l_savepoint varchar2(30);
begin
- 356
ut_utils.debug_log('ut_test.execute');
- 356
if self.get_disabled_flag() then
- 11
mark_as_skipped();
else
- 345
self.start_time := current_timestamp;
- 346
ut_event_manager.trigger_event(ut_event_manager.gc_before_test, self);
- 345
l_savepoint := self.create_savepoint_if_needed();
--includes listener calls for before and after actions
- 345
l_no_errors := true;
- 345
for i in 1 .. self.before_each_list.count loop
- 35
l_no_errors := self.before_each_list(i).do_execute(self);
- 35
exit when not l_no_errors;
end loop;
- 345
if l_no_errors then
- 342
for i in 1 .. self.before_test_list.count loop
- 30
l_no_errors := self.before_test_list(i).do_execute(self);
- 30
exit when not l_no_errors;
end loop;
- 342
if l_no_errors then
-- execute the test
- 337
self.item.do_execute(self, self.expected_error_codes);
end if;
-- perform cleanup regardless of the test or setup failure
- 359
for i in 1 .. self.after_test_list.count loop
- 17
self.after_test_list(i).do_execute(self);
end loop;
end if;
- 387
for i in 1 .. self.after_each_list.count loop
- 42
self.after_each_list(i).do_execute(self);
end loop;
- 345
self.rollback_to_savepoint(l_savepoint);
- 345
self.calc_execution_result();
- 345
self.end_time := current_timestamp;
- 345
ut_event_manager.trigger_event(ut_event_manager.gc_after_test, self);
end if;
- 356
return l_no_errors;
end;
overriding member procedure calc_execution_result(self in out nocopy ut_test) is
l_warnings ut_varchar2_rows;
begin
- 347
if self.get_error_stack_traces().count = 0 then
- 261
self.result := ut_expectation_processor.get_status();
else
- 86
self.result := ut_utils.gc_error;
end if;
--expectation results need to be part of test results
- 347
self.all_expectations := ut_expectation_processor.get_all_expectations();
- 347
self.failed_expectations := ut_expectation_processor.get_failed_expectations();
- 347
l_warnings := coalesce( ut_expectation_processor.get_warnings(), ut_varchar2_rows() );
- 347
self.warnings := self.warnings multiset union all l_warnings;
- 347
self.results_count.increase_warning_count( cardinality(l_warnings) );
- 347
self.results_count.set_counter_values(self.result);
- 347
ut_expectation_processor.clear_expectations();
end;
overriding member procedure mark_as_errored(self in out nocopy ut_test, a_error_stack_trace varchar2) is
begin
- 2
ut_utils.debug_log('ut_test.fail');
- 2
ut_event_manager.trigger_event(ut_event_manager.gc_before_test, self);
- 2
self.start_time := current_timestamp;
- 2
self.parent_error_stack_trace := a_error_stack_trace;
- 2
self.calc_execution_result();
- 2
self.end_time := self.start_time;
- 2
ut_event_manager.trigger_event(ut_event_manager.gc_after_test, self);
end;
overriding member function get_error_stack_traces(self ut_test) return ut_varchar2_list is
- 424
l_stack_traces ut_varchar2_list := ut_varchar2_list();
begin
- 424
ut_utils.append_to_list(l_stack_traces, self.parent_error_stack_trace);
- 466
for i in 1 .. before_each_list.count loop
- 42
ut_utils.append_to_list(l_stack_traces, self.before_each_list(i).get_error_stack_trace());
end loop;
- 464
for i in 1 .. before_test_list.count loop
- 40
ut_utils.append_to_list(l_stack_traces, self.before_test_list(i).get_error_stack_trace());
end loop;
- 424
ut_utils.append_to_list(l_stack_traces, self.item.get_error_stack_trace());
- 441
for i in 1 .. after_test_list.count loop
- 17
ut_utils.append_to_list(l_stack_traces, self.after_test_list(i).get_error_stack_trace());
end loop;
- 475
for i in 1 .. after_each_list.count loop
- 51
ut_utils.append_to_list(l_stack_traces, self.after_each_list(i).get_error_stack_trace());
end loop;
- 424
return l_stack_traces;
end;
overriding member function get_serveroutputs return clob is
l_outputs clob;
begin
- 278
for i in 1 .. before_each_list.count loop
- 24
ut_utils.append_to_clob(l_outputs, self.before_each_list(i).serveroutput);
end loop;
- 278
for i in 1 .. before_test_list.count loop
- 24
ut_utils.append_to_clob(l_outputs, self.before_test_list(i).serveroutput);
end loop;
- 254
ut_utils.append_to_clob(l_outputs, self.item.serveroutput );
- 263
for i in 1 .. after_test_list.count loop
- 9
ut_utils.append_to_clob(l_outputs, self.after_test_list(i).serveroutput);
end loop;
- 285
for i in 1 .. after_each_list.count loop
- 31
ut_utils.append_to_clob(l_outputs, self.after_each_list(i).serveroutput);
end loop;
- 254
return l_outputs;
end;
member function get_failed_expectation_lines return ut_varchar2_rows is
l_results ut_varchar2_rows;
begin
- 34
for i in 1 .. failed_expectations.count loop
- 17
ut_utils.append_to_list( l_results, ut_utils.convert_collection( failed_expectations(i).get_result_lines() ) );
- 17
ut_utils.append_to_list( l_results, failed_expectations(i).caller_info );
end loop;
- 17
return l_results;
end;
end;
UT3.UT_EXPECTATION_PROCESSOR
100 % lines covered
71 relevant lines. 71 lines covered and 0 lines missed
package body ut_expectation_processor as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type tt_nls_params is table of nls_session_parameters%rowtype;
g_session_params tt_nls_params;
- 1
g_expectations_called ut_expectation_results := ut_expectation_results();
- 1
g_warnings ut_varchar2_rows := ut_varchar2_rows();
- 1
g_nulls_are_equal boolean_not_null := gc_default_nulls_are_equal;
- 1
g_package_invalidated boolean := false;
function nulls_are_equal return boolean is
begin
- 373
return g_nulls_are_equal;
end;
procedure nulls_are_equal(a_setting boolean_not_null) is
begin
- 4
g_nulls_are_equal := a_setting;
end;
function get_status return integer is
- 261
l_result integer := ut_utils.gc_success;
begin
- 261
ut_utils.debug_log('ut_expectation_processor.get_status');
- 261
for i in 1 .. g_expectations_called.count loop
- 82
l_result := greatest(l_result, g_expectations_called(i).status);
- 82
exit when l_result = ut_utils.gc_error;
end loop;
- 261
return l_result;
end get_status;
procedure clear_expectations is
begin
- 1188
ut_utils.debug_log('ut_expectation_processor.clear_expectations');
- 1188
g_expectations_called.delete;
- 1188
g_warnings.delete;
end;
function get_all_expectations return ut_expectation_results is
begin
- 347
ut_utils.debug_log('ut_expectation_processor.get_all_expectations: g_expectations_called.count='||g_expectations_called.count);
- 347
return g_expectations_called;
end get_all_expectations;
function get_failed_expectations return ut_expectation_results is
- 1039
l_expectations_results ut_expectation_results := ut_expectation_results();
begin
- 1039
ut_utils.debug_log('ut_expectation_processor.get_failed_expectations: g_expectations_called.count='||g_expectations_called.count);
- 1813
for i in 1 .. g_expectations_called.count loop
- 774
if g_expectations_called(i).status > ut_utils.gc_success then
- 423
l_expectations_results.extend;
- 423
l_expectations_results(l_expectations_results.last) := g_expectations_called(i);
end if;
end loop;
- 1039
ut_utils.debug_log('ut_expectation_processor.get_failed_expectations: l_expectations_results.count='||l_expectations_results.count);
- 1039
return l_expectations_results;
end get_failed_expectations;
procedure add_expectation_result(a_expectation_result ut_expectation_result) is
l_results ut_varchar2_list;
begin
- 799
if ut_session_context.is_ut_run then
- 794
ut_event_manager.trigger_event(ut_event_manager.gc_debug, a_expectation_result);
- 793
g_expectations_called.extend;
- 793
g_expectations_called(g_expectations_called.last) := a_expectation_result;
else
- 6
l_results := a_expectation_result.get_result_lines();
- 6
dbms_output.put_line( upper( ut_utils.test_result_to_char( a_expectation_result.status ) ) || '');
- 12
for i in 1 .. l_results.count loop
- 6
dbms_output.put_line( ' ' || l_results(i) );
end loop;
- 6
if a_expectation_result.caller_info is not null then
- 2
dbms_output.put_line( ut_utils.indent_lines( a_expectation_result.caller_info, 2, true) );
end if;
end if;
end;
procedure report_failure(a_message in varchar2) is
begin
- 1
add_expectation_result(ut_expectation_result(ut_utils.gc_failure, null, a_message));
end;
function get_session_parameters return tt_nls_params is
l_session_params tt_nls_params;
begin
- 397
select nsp.parameter, nsp.value
bulk collect into l_session_params
from nls_session_parameters nsp
where parameter
in ( 'NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT')
order by 1;
- 397
return l_session_params;
end;
procedure set_xml_nls_params is
insuf_privs exception;
pragma exception_init(insuf_privs, -1031);
begin
- 397
g_session_params := get_session_parameters();
begin
- 397
execute immediate q'[alter session set events '19119 trace name context forever, level 0x8']';
exception
- 1191
when insuf_privs then NULL;
end;
- 397
execute immediate 'alter session set nls_timestamp_format = '''||ut_utils.gc_timestamp_format||'''';
- 397
execute immediate 'alter session set nls_timestamp_tz_format = '''||ut_utils.gc_timestamp_tz_format||'''';
end;
procedure reset_nls_params is
insuf_privs exception;
pragma exception_init(insuf_privs, -1031);
begin
begin
- 397
execute immediate q'[alter session set events '19119 trace name context off']';
exception
- 1191
when insuf_privs then NULL;
end;
- 397
if g_session_params is not null then
- 1588
for i in 1 .. g_session_params.count loop
- 1191
execute immediate 'alter session set '||g_session_params(i).parameter||' = '''||g_session_params(i).value||'''';
end loop;
end if;
end;
function who_called_expectation(a_call_stack varchar2) return varchar2 is
l_caller_stack_line varchar2(4000);
l_call_stack varchar2(4000);
l_line_no integer;
l_owner varchar2(1000);
l_object_name varchar2(1000);
l_result varchar2(4000);
-- in 12.2 format_call_stack reportes not only package name, but also the procedure name
-- when 11g and 12c reports only package name
function cut_header_and_expectations( a_stack varchar2 ) return varchar2 is
begin
- 450
return regexp_substr( a_stack, '(.*\.(UT_EXPECTATION[A-Z0-9#_$]*|UT|UTASSERT2?)(\.[A-Z0-9#_$]+)?\s+)+((.|\s)*)', 1, 1, 'm', 4);
end;
function cut_address_columns( a_stack varchar2 ) return varchar2 is
begin
- 450
return regexp_replace( a_stack, '^(0x)?[0-9a-f]+\s+', '', 1, 0, 'm' );
end;
function cut_framework_stack( a_stack varchar2 ) return varchar2 is
begin
- 450
return regexp_replace(
a_stack,
'[0-9]+\s+anonymous\s+block\s+[0-9]+\s+package\s+body\s+sys\.dbms_sql(\.execute)?\s+[0-9]+\s+[0-9_$#a-z ]+\.ut_executable.*',
'',
1, 1, 'mni'
);
end;
function format_stack( a_stack varchar2 ) return varchar2 is
begin
- 450
return regexp_replace(
a_stack,
'([0-9]+)\s+(.* )?((anonymous block)|(([0-9_$#a-z]+\.[0-9_$#a-z]+(\.([0-9_$#a-z])+)?)))',
'at "\3", line \1', 1, 0, 'i'
);
end;
begin
- 450
l_call_stack := cut_header_and_expectations( a_call_stack );
- 450
l_call_stack := cut_address_columns( l_call_stack );
- 450
l_call_stack := cut_framework_stack( l_call_stack );
- 450
l_call_stack := format_stack( l_call_stack );
- 450
l_caller_stack_line := regexp_substr(l_call_stack,'^(.*)');
- 450
if l_caller_stack_line like '%.%' then
- 195
l_line_no := to_number( regexp_substr( l_caller_stack_line, ', line (\d+)', subexpression => 1 ) );
- 195
l_owner := regexp_substr( l_caller_stack_line, 'at "([A-Za-z0-9$#_]+)\.(([A-Za-z0-9$#_]+)(\.([A-Za-z0-9$#_]+))?)", line (\d+)', subexpression => 1 );
- 195
l_object_name := regexp_substr( l_caller_stack_line, 'at "([A-Za-z0-9$#_]+)\.(([A-Za-z0-9$#_]+)(\.([A-Za-z0-9$#_]+))?)", line (\d+)', subexpression => 3 );
- 195
l_result :=
l_caller_stack_line || ' ' || rtrim(ut_metadata.get_source_definition_line(l_owner, l_object_name, l_line_no),chr(10))
|| replace( l_call_stack, l_caller_stack_line );
else
- 255
l_result := l_call_stack;
end if;
- 450
return rtrim(l_result,chr(10));
end;
procedure add_warning(a_messsage varchar2) is
begin
- 23
g_warnings.extend;
- 23
g_warnings(g_warnings.last) := a_messsage;
end;
procedure add_depreciation_warning(a_deprecated_syntax varchar2, a_new_syntax varchar2) is
begin
- 17
add_warning(
ut_utils.build_depreciation_warning( a_deprecated_syntax, a_new_syntax ) || chr(10)
|| ut_expectation_processor.who_called_expectation(dbms_utility.format_call_stack())
);
end;
function get_warnings return ut_varchar2_rows is
begin
- 371
return g_warnings;
end;
function invalidation_exception_found return boolean is
begin
- 113
return g_package_invalidated;
end;
procedure set_invalidation_exception is
begin
- 1
g_package_invalidated := true;
end;
procedure reset_invalidation_exception is
begin
- 117
g_package_invalidated := false;
end;
end;
UT3.UT_FILE_MAPPER
100 % lines covered
27 relevant lines. 27 lines covered and 0 lines missed
package body ut_file_mapper is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type tt_key_values is table of varchar2(4000) index by varchar2(4000);
/**
* Private functions
*/
function to_hash_table(a_key_value_tab ut_key_value_pairs) return tt_key_values is
l_result tt_key_values;
begin
- 31
if a_key_value_tab is not null then
- 217
for i in 1 .. a_key_value_tab.count loop
- 186
l_result(upper(a_key_value_tab(i).key)) := a_key_value_tab(i).value;
end loop;
end if;
- 31
return l_result;
end;
/**
* Public functions
*/
function default_file_to_obj_type_map return ut_key_value_pairs is
begin
- 31
return ut_key_value_pairs(
ut_key_value_pair('fnc', 'FUNCTION'),
ut_key_value_pair('prc', 'PROCEDURE'),
ut_key_value_pair('tpb', 'TYPE BODY'),
ut_key_value_pair('pkb', 'PACKAGE BODY'),
ut_key_value_pair('bdy', 'PACKAGE BODY'),
ut_key_value_pair('trg', 'TRIGGER')
);
end;
function build_file_mappings(
a_file_paths ut_varchar2_list,
a_file_to_object_type_mapping ut_key_value_pairs := null,
a_regex_pattern varchar2 := null,
a_object_owner_subexpression positive := null,
a_object_name_subexpression positive := null,
a_object_type_subexpression positive := null
) return ut_file_mappings is
begin
- 29
return build_file_mappings(
null, a_file_paths, a_file_to_object_type_mapping, a_regex_pattern,
a_object_owner_subexpression, a_object_name_subexpression, a_object_type_subexpression
);
end;
function build_file_mappings(
a_object_owner varchar2,
a_file_paths ut_varchar2_list,
a_file_to_object_type_mapping ut_key_value_pairs := null,
a_regex_pattern varchar2 := null,
a_object_owner_subexpression positive := null,
a_object_name_subexpression positive := null,
a_object_type_subexpression positive := null
) return ut_file_mappings is
- 31
l_file_to_object_type_mapping ut_key_value_pairs := coalesce(a_file_to_object_type_mapping, default_file_to_obj_type_map());
- 31
l_regex_pattern varchar2(4000) := coalesce(a_regex_pattern, gc_file_mapping_regex);
- 31
l_object_owner_subexpression positive := coalesce(a_object_owner_subexpression, gc_regex_owner_subexpression);
- 31
l_object_name_subexpression positive := coalesce(a_object_name_subexpression, gc_regex_name_subexpression);
- 31
l_object_type_subexpression positive := coalesce(a_object_type_subexpression, gc_regex_type_subexpression);
l_key_values tt_key_values;
l_mappings ut_file_mappings;
l_mapping ut_file_mapping;
l_object_type_key varchar2(4000);
l_object_type varchar2(4000);
l_object_owner varchar2(4000);
l_file_path varchar2(32767);
begin
- 31
if a_file_paths is not null then
- 31
l_key_values := to_hash_table(l_file_to_object_type_mapping);
- 31
l_mappings := ut_file_mappings();
- 67
for i in 1 .. a_file_paths.count loop
- 36
l_file_path := replace(a_file_paths(i),'\','/');
- 36
l_object_type_key := upper(regexp_substr(l_file_path, l_regex_pattern, 1, 1, 'i', l_object_type_subexpression));
- 36
if l_key_values.exists(l_object_type_key) then
- 34
l_object_type := upper(l_key_values(l_object_type_key));
else
- 2
l_object_type := null;
end if;
- 36
l_object_owner := coalesce(
- 1
upper(a_object_owner),
- 1
upper(regexp_substr(l_file_path, l_regex_pattern, 1, 1, 'i', l_object_owner_subexpression)),
sys_context('USERENV', 'CURRENT_SCHEMA'));
- 36
l_mapping := ut_file_mapping(
file_name => a_file_paths(i),
object_owner => l_object_owner,
object_name => upper(regexp_substr(l_file_path, l_regex_pattern, 1, 1, 'i', l_object_name_subexpression)),
object_type => l_object_type
);
- 36
l_mappings.extend();
- 36
l_mappings(l_mappings.last) := l_mapping;
end loop;
end if;
- 31
return l_mappings;
end;
end;
UT3.UT_METADATA
91.76 % lines covered
85 relevant lines. 78 lines covered and 7 lines missed
package body ut_metadata as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
type t_cache is table of all_source.text%type;
g_source_cache t_cache;
g_cached_object varchar2(500);
------------------------------
--public definitions
function form_name(a_owner_name varchar2, a_object varchar2, a_subprogram varchar2 default null) return varchar2 is
l_name varchar2(200);
begin
- 563
l_name := trim(a_object);
- 563
if trim(a_owner_name) is not null then
- 176
l_name := trim(a_owner_name) || '.' || l_name;
end if;
- 563
if trim(a_subprogram) is not null then
- 561
l_name := l_name || '.' || trim(a_subprogram);
end if;
- 563
return l_name;
end form_name;
function package_valid(a_owner_name varchar2, a_package_name in varchar2) return boolean as
l_cnt number;
- 12
l_view_name varchar2(200) := get_objects_view_name;
begin
- 12
execute immediate q'[select count(*)
from ]'||l_view_name||q'[
where owner = :a_owner_name
and object_name = :a_package_name
and object_type = 'PACKAGE'
and status = 'VALID']'
into l_cnt using upper(a_owner_name), upper(a_package_name);
- 12
return l_cnt = 1;
exception
when others then
return false;
end;
function procedure_exists(a_owner_name varchar2, a_package_name in varchar2, a_procedure_name in varchar2)
return boolean as
l_cnt number;
- 6
l_view_name varchar2(200) := get_dba_view('dba_procedures');
begin
- 6
execute immediate
'select count(*) from '||l_view_name
||' where owner = :l_schema and object_name = :l_package_name and procedure_name = :l_procedure_name and rownum = 1'
into l_cnt using a_owner_name, a_package_name, a_procedure_name;
--expect one method only for the package with that name.
- 6
return l_cnt = 1;
exception
when others then
return false;
end;
function get_source_definition_line(a_owner varchar2, a_object_name varchar2, a_line_no integer) return varchar2 is
- 195
l_view_name varchar2(128) := get_source_view_name();
l_line all_source.text%type;
- 195
c_key constant varchar2(500) := a_owner || '.' || a_object_name;
begin
- 195
if not nvl(c_key = g_cached_object, false) then
- 50
g_cached_object := c_key;
- 50
execute immediate
'select trim(text) text
from '||l_view_name||q'[ s
where s.owner = :a_owner
and s.name = :a_object_name
/*skip the declarations, consider only definitions*/
and s.type not in ('PACKAGE', 'TYPE')
order by line]'
bulk collect into g_source_cache
using a_owner, a_object_name;
end if;
- 195
if g_source_cache.exists(a_line_no) then
- 190
l_line := g_source_cache(a_line_no);
end if;
- 195
return l_line;
end;
procedure reset_source_definition_cache is
begin
- 116
g_source_cache := null;
- 116
g_cached_object := null;
end;
function get_dba_view(a_dba_view_name varchar2) return varchar2 is
- 903
l_result varchar2(128) := lower(a_dba_view_name);
begin
- 903
if not is_object_visible(a_dba_view_name) then
- 761
l_result := replace(l_result,'dba_','all_');
end if;
- 903
return l_result;
end;
function get_source_view_name return varchar2 is
begin
- 293
return get_dba_view('dba_source');
end;
function get_objects_view_name return varchar2 is
begin
- 604
return get_dba_view('dba_objects');
end;
function user_has_execute_any_proc return boolean is
- 169
l_ut_owner varchar2(250) := ut_utils.ut_owner;
begin
- 169
return is_object_visible(l_ut_owner||'.ut_utils');
end;
function is_object_visible(a_object_name varchar2) return boolean is
l_invalid_object_name exception;
pragma exception_init(l_invalid_object_name,-44002);
begin
- 1377
return dbms_assert.sql_object_name(a_object_name) is not null;
exception
- 1972
when l_invalid_object_name then
- 986
return false;
end;
function package_exists_in_cur_schema(a_object_name varchar2) return boolean is
l_cnt number;
- 135
c_current_schema constant all_tables.owner%type := sys_context('USERENV','CURRENT_SCHEMA');
begin
- 135
select count(*)
into l_cnt
from all_objects t
where t.object_name = a_object_name
and t.object_type = 'PACKAGE'
and t.owner = c_current_schema;
- 135
return l_cnt > 0;
end;
function is_collection (a_anytype_code in integer) return boolean is
begin
- 1062
return coalesce(a_anytype_code in (dbms_types.typecode_varray,dbms_types.typecode_table,dbms_types.typecode_namedcollection),false);
end;
function is_collection (a_owner varchar2, a_type_name varchar2) return boolean is
begin
- 845
return is_collection(
get_anytype_members_info(
get_user_defined_type(a_owner, a_type_name)
).type_code
);
end;
function get_attr_elem_info( a_anytype anytype, a_pos pls_integer := null )
return t_anytype_elem_info_rec is
l_result t_anytype_elem_info_rec;
begin
- 525
if a_anytype is not null then
- 525
l_result.type_code := a_anytype.getattreleminfo(
pos => a_pos,
prec => l_result.precision,
scale => l_result.scale,
len => l_result.length,
csid => l_result.char_set_id,
csfrm => l_result.char_set_frm,
attr_elt_type => l_result.attr_elt_type,
aname => l_result.attribute_name
);
end if;
- 525
return l_result;
end;
function get_anytype_members_info( a_anytype anytype )
return t_anytype_members_rec is
l_result t_anytype_members_rec;
begin
- 1062
if a_anytype is not null then
- 336
l_result.type_code := a_anytype.getinfo(
prec => l_result.precision,
scale => l_result.scale,
len => l_result.length,
csid => l_result.char_set_id,
csfrm => l_result.char_set_frm,
schema_name => l_result.schema_name,
type_name => l_result.type_name,
version => l_result.version,
numelems => l_result.elements_count
);
end if;
- 1062
return l_result;
end;
function get_user_defined_type(a_owner varchar2, a_type_name varchar2) return anytype is
l_anytype anytype;
not_found exception;
pragma exception_init(not_found,-22303);
begin
- 964
if a_type_name is not null then
begin
- 238
if ut_metadata.is_object_visible('GETANYTYPEFROMPERSISTENT') then
- 238
execute immediate 'begin :l_anytype := getanytypefrompersistent( :a_owner, :a_type_name ); end;'
using out l_anytype, in nvl(a_owner,sys_context('userenv','current_schema')), in a_type_name;
else
execute immediate 'begin :l_anytype := anytype.getpersistent( :a_owner, :a_type_name ); end;'
using out l_anytype, in nvl(a_owner,sys_context('userenv','current_schema')), in a_type_name;
end if;
exception
when not_found then
null;
end;
end if;
- 964
return l_anytype;
end;
function get_collection_element(a_anydata in anydata) return varchar2
is
l_anytype anytype;
l_nested_type t_anytype_members_rec;
l_elements_rec t_anytype_elem_info_rec;
l_type_code integer;
begin
- 72
l_type_code := a_anydata.gettype(l_anytype);
- 72
if is_collection(l_type_code) then
- 72
l_elements_rec := get_attr_elem_info(l_anytype);
- 72
if l_elements_rec.attr_elt_type is null then
- 38
l_nested_type := get_anytype_members_info(l_anytype);
else
- 34
l_nested_type := get_anytype_members_info(l_elements_rec.attr_elt_type);
end if;
end if;
- 72
return l_nested_type.schema_name || '.' ||l_nested_type.type_name;
end;
function has_collection_members (a_anydata in anydata) return boolean is
l_anytype anytype;
l_elements_rec t_anytype_elem_info_rec;
l_type_code integer;
begin
- 72
l_type_code := a_anydata.gettype(l_anytype);
- 72
l_elements_rec := get_attr_elem_info(l_anytype);
- 72
return l_elements_rec.attr_elt_type is not null;
end;
function get_anydata_typename(a_data_value anydata) return varchar2
is
begin
- 335
return case when a_data_value is not null then lower(a_data_value.gettypename()) else 'undefined' end;
end;
function is_anytype_null(a_value in anydata, a_compound_type in varchar2) return number is
- 173
l_result integer := 0;
l_anydata_sql varchar2(4000);
l_compound_type varchar2(250);
begin
- 173
if a_value is not null then
- 162
l_compound_type := sys.dbms_assert.qualified_sql_name(a_compound_type);
- 162
l_anydata_sql := '
declare
l_data '||get_anydata_typename(a_value)||';
l_value anydata := :a_value;
l_status integer;
begin
l_status := l_value.get'||l_compound_type||'(l_data);
:l_data_is_null := case when l_data is null then 1 else 0 end;
end;';
- 162
execute immediate l_anydata_sql using in a_value, out l_result;
else
- 11
l_result := 1;
end if;
- 173
return l_result;
end;
function get_object_name(a_full_object_name in varchar2) return varchar2 is
l_result varchar2(250);
begin
- 127
l_result := regexp_substr(
a_full_object_name,
'^([A-Za-z0-9$#_]+|".*?")\.([A-Za-z0-9$#_]+|".*?")', subexpression => 2
);
- 127
if not l_result like '"%"' then
- 127
l_result := upper(l_result);
end if;
- 127
return ut_utils.qualified_sql_name(l_result);
end;
function get_anydata_compound_type(a_data_value anydata) return varchar2 is
l_result varchar2(30);
l_type anytype;
l_type_code integer;
begin
- 173
if a_data_value is not null then
- 162
l_type_code := a_data_value.gettype(l_type);
- 162
if l_type_code in (dbms_types.typecode_table, dbms_types.typecode_varray, dbms_types.typecode_namedcollection,
- 1
dbms_types.typecode_object) then
- 162
if l_type_code = dbms_types.typecode_object then
- 67
l_result := 'object';
else
- 95
l_result := 'collection';
end if;
end if;
end if;
- 173
return l_result;
end;
end;
UT3.UT_SUITE_BUILDER
98.76 % lines covered
322 relevant lines. 318 lines covered and 4 lines missed
package body ut_suite_builder is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
subtype t_annotation_text is varchar2(4000);
subtype t_annotation_name is varchar2(4000);
subtype t_object_name is varchar2(500);
subtype t_annotation_position is binary_integer;
- 1
gc_suite constant t_annotation_name := 'suite';
- 1
gc_suitepath constant t_annotation_name := 'suitepath';
- 1
gc_tags constant t_annotation_name := 'tags';
- 1
gc_test constant t_annotation_name := ut_utils.gc_test_execute;
- 1
gc_disabled constant t_annotation_name := 'disabled';
- 1
gc_displayname constant t_annotation_name := 'displayname';
- 1
gc_beforeall constant t_annotation_name := ut_utils.gc_before_all;
- 1
gc_beforeeach constant t_annotation_name := ut_utils.gc_before_each;
- 1
gc_beforetest constant t_annotation_name := ut_utils.gc_before_test;
- 1
gc_afterall constant t_annotation_name := ut_utils.gc_after_all;
- 1
gc_aftereach constant t_annotation_name := ut_utils.gc_after_each;
- 1
gc_aftertest constant t_annotation_name := ut_utils.gc_after_test;
- 1
gc_throws constant t_annotation_name := 'throws';
- 1
gc_rollback constant t_annotation_name := 'rollback';
- 1
gc_context constant t_annotation_name := 'context';
- 1
gc_endcontext constant t_annotation_name := 'endcontext';
type tt_annotations is table of t_annotation_name;
- 1
gc_supported_annotations constant tt_annotations
:= tt_annotations(
gc_suite,
gc_suitepath,
gc_tags,
gc_test,
gc_disabled,
gc_displayname,
gc_beforeall,
gc_beforeeach,
gc_beforetest,
gc_afterall,
gc_aftereach,
gc_aftertest,
gc_throws,
gc_rollback,
gc_context,
gc_endcontext
);
- 1
gc_integer_exception constant varchar2(1) := 'I';
- 1
gc_named_exception constant varchar2(1) := 'N';
type tt_executables is table of ut_executables index by t_annotation_position;
type t_annotation is record(
name t_annotation_name,
text t_annotation_text,
procedure_name t_object_name
);
type tt_annotations_by_line is table of t_annotation index by t_annotation_position;
--list of annotation texts for a given annotation indexed by annotation position:
--This would hold: ('some', 'other') for a single annotation name recurring in a single procedure example
-- --%beforetest(some)
-- --%beforetest(other)
-- --%test(some test with two before test procedures)
-- procedure some_test ...
-- when you'd like to have two beforetest procedures executed in a single test
type tt_annotation_texts is table of t_annotation_text index by t_annotation_position;
type tt_annotations_by_name is table of tt_annotation_texts index by t_annotation_name;
type tt_annotations_by_proc is table of tt_annotations_by_name index by t_object_name;
type t_annotations_info is record (
owner t_object_name,
name t_object_name,
parse_time timestamp,
by_line tt_annotations_by_line,
by_proc tt_annotations_by_proc,
by_name tt_annotations_by_name
);
function get_qualified_object_name(
a_suite ut_suite_item, a_procedure_name t_object_name
) return varchar2 is
l_result varchar2(1000);
begin
- 54
if a_suite is not null then
- 54
l_result := upper( a_suite.object_owner || '.' || a_suite.object_name );
- 54
if a_procedure_name is not null then
- 32
l_result := l_result || upper( '.' || a_procedure_name );
end if;
end if;
- 54
return l_result;
end;
function get_object_reference(
a_suite ut_suite_item, a_procedure_name t_object_name, a_line_no binary_integer
) return varchar2 is
begin
- 54
return chr( 10 ) || 'at package "' || get_qualified_object_name(a_suite, a_procedure_name) || '", line ' || a_line_no;
end;
procedure delete_annotations_range(
a_annotations in out nocopy t_annotations_info,
a_start_pos t_annotation_position,
a_end_pos t_annotation_position
) is
- 177
l_pos t_annotation_position := a_start_pos;
l_annotation t_annotation;
begin
- 2037
while l_pos is not null and l_pos <= a_end_pos loop
- 1860
l_annotation := a_annotations.by_line(l_pos);
- 1860
if l_annotation.procedure_name is not null and a_annotations.by_proc.exists(l_annotation.procedure_name) then
- 1163
a_annotations.by_proc.delete(l_annotation.procedure_name);
- 697
elsif a_annotations.by_name.exists(l_annotation.name) then
- 530
a_annotations.by_name(l_annotation.name).delete(l_pos);
- 530
if a_annotations.by_name(l_annotation.name).count = 0 then
- 169
a_annotations.by_name.delete(l_annotation.name);
end if;
end if;
- 1860
l_pos := a_annotations.by_line.next( l_pos );
end loop;
- 177
a_annotations.by_line.delete(a_start_pos, a_end_pos);
end;
procedure add_items_to_list(a_list in out nocopy ut_suite_items, a_items ut_suite_items) is
begin
- 1286
for i in 1 .. a_items.count loop
- 1110
a_list.extend();
- 1110
a_list(a_list.last) := a_items(i);
end loop;
end;
-----------------------------------------------
-- Processing annotations
-----------------------------------------------
procedure add_annotation_ignored_warning(
a_suite in out nocopy ut_suite_item,
a_annotation t_annotation_name,
a_message varchar2,
a_line_no binary_integer,
a_procedure_name t_object_name := null
) is
begin
- 30
a_suite.put_warning(
replace(a_message,'%%%','"--%'||a_annotation||'"')
|| ' Annotation ignored.' || get_object_reference( a_suite, a_procedure_name, a_line_no )
);
end;
function get_rollback_type(a_rollback_type_name varchar2) return ut_utils.t_rollback_type is
l_rollback_type ut_utils.t_rollback_type;
begin
- 22
l_rollback_type :=
- 1
case lower(a_rollback_type_name)
- 1
when 'manual' then ut_utils.gc_rollback_manual
- 1
when 'auto' then ut_utils.gc_rollback_auto
end;
- 22
return l_rollback_type;
end;
procedure add_to_throws_numbers_list(
a_suite in out nocopy ut_suite,
a_list in out nocopy ut_integer_list,
a_procedure_name t_object_name,
a_throws_ann_text tt_annotation_texts
) is
l_annotation_pos binary_integer;
function is_valid_qualified_name (a_name varchar2) return boolean is
l_name varchar2(500);
begin
- 51
l_name := dbms_assert.qualified_sql_name(a_name);
- 19
return true;
- 64
exception when others then
- 32
return false;
end;
function check_exception_type(a_exception_name in varchar2) return varchar2 is
l_exception_type varchar2(50);
begin
--check if it is a predefined exception
begin
- 19
execute immediate 'begin null; exception when '||a_exception_name||' then null; end;';
- 3
l_exception_type := gc_named_exception;
exception
- 32
when others then
- 16
if dbms_utility.format_error_stack() like '%PLS-00485%' then
begin
- 7
execute immediate 'declare x positiven := -('||a_exception_name||'); begin null; end;';
- 7
l_exception_type := gc_integer_exception;
exception
when others then
--invalid exception number (positive)
--TODO add warning for this value
null;
end;
end if;
end;
- 19
return l_exception_type;
end;
function get_exception_number (a_exception_var in varchar2) return integer is
l_exc_no integer;
l_exc_type varchar2(50);
function remap_no_data_found (a_number integer) return integer is
begin
- 19
return case a_number when 100 then -1403 else a_number end;
end;
begin
- 19
l_exc_type := check_exception_type(a_exception_var);
- 19
if l_exc_type is not null then
- 10
execute immediate
- 1
case l_exc_type
- 1
when gc_integer_exception then
'declare
l_exception number;
begin
:l_exception := '||a_exception_var||'; '
- 1
when gc_named_exception then
'begin
raise '||a_exception_var||';
exception
when others then
:l_exception := sqlcode; '
end ||
'end;'
using out l_exc_no;
end if;
- 19
return remap_no_data_found(l_exc_no);
end;
function build_exception_numbers_list(
a_suite in out nocopy ut_suite,
a_procedure_name t_object_name,
a_line_no integer,
a_annotation_text in varchar2
) return ut_integer_list is
l_throws_list ut_varchar2_list;
l_exception_number integer;
- 29
l_exception_number_list ut_integer_list := ut_integer_list();
- 29
c_regexp_for_exception_no constant varchar2(30) := '^-?[[:digit:]]{1,5}$';
begin
--the a_expected_error_codes is converted to a ut_varchar2_list after that is trimmed and filtered to left only valid exception numbers
- 29
l_throws_list := ut_utils.trim_list_elements(ut_utils.string_to_table(a_annotation_text, ',', 'Y'));
- 80
for i in 1 .. l_throws_list.count
loop
/**
* Check if its a valid qualified name and if so try to resolve name to an exception number
*/
- 51
if is_valid_qualified_name(l_throws_list(i)) then
- 19
l_exception_number := get_exception_number(l_throws_list(i));
- 32
elsif regexp_like(l_throws_list(i), c_regexp_for_exception_no) then
- 24
l_exception_number := l_throws_list(i);
end if;
- 51
if l_exception_number is null then
- 17
a_suite.put_warning(
'Invalid parameter value "'||l_throws_list(i)
||'" for "--%throws" annotation. Parameter ignored.'||get_object_reference( a_suite, a_procedure_name, a_line_no )
);
else
- 34
l_exception_number_list.extend;
- 34
l_exception_number_list(l_exception_number_list.last) := l_exception_number;
end if;
- 51
l_exception_number := null;
end loop;
- 29
return l_exception_number_list;
end;
begin
- 33
a_list := ut_integer_list();
- 33
l_annotation_pos := a_throws_ann_text.first;
- 66
while l_annotation_pos is not null loop
- 33
if a_throws_ann_text(l_annotation_pos) is null then
- 4
a_suite.put_warning(
'"--%throws" annotation requires a parameter. Annotation ignored.'
|| get_object_reference( a_suite, a_procedure_name, l_annotation_pos )
);
else
- 29
a_list :=
a_list multiset union
build_exception_numbers_list(
a_suite,
a_procedure_name,
l_annotation_pos,
a_throws_ann_text(l_annotation_pos)
);
end if;
- 33
l_annotation_pos := a_throws_ann_text.next(l_annotation_pos);
end loop;
end;
procedure add_tags_to_suite_item(
a_suite in out nocopy ut_suite,
a_tags_ann_text tt_annotation_texts,
a_list in out nocopy ut_varchar2_rows,
a_procedure_name t_object_name := null
) is
l_annotation_pos binary_integer;
- 55
l_tag_list ut_varchar2_list := ut_varchar2_list();
begin
- 55
l_annotation_pos := a_tags_ann_text.first;
- 114
while l_annotation_pos is not null loop
- 59
if a_tags_ann_text(l_annotation_pos) is null then
- 3
a_suite.put_warning(
'"--%tags" annotation requires a tag value populated. Annotation ignored.'
|| get_object_reference( a_suite, a_procedure_name, l_annotation_pos )
);
else
- 56
l_tag_list := l_tag_list multiset union distinct ut_utils.trim_list_elements(
ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos),',')
);
end if;
- 59
l_annotation_pos := a_tags_ann_text.next(l_annotation_pos);
end loop;
--remove empty strings from table list e.g. tag1,,tag2 and conver to rows
- 55
a_list := ut_utils.convert_collection( ut_utils.filter_list(l_tag_list,ut_utils.gc_word_no_space) );
end;
procedure set_seq_no(
a_list in out nocopy ut_executables
) is
begin
- 8368
if a_list is not null then
- 10116
for i in 1 .. a_list.count loop
- 1748
a_list(i).seq_no := i;
end loop;
end if;
end;
function convert_list(
a_list tt_executables
) return ut_executables is
- 8368
l_result ut_executables := ut_executables();
- 8368
l_pos t_annotation_position := a_list.first;
begin
- 10004
while l_pos is not null loop
- 3308
for i in 1 .. a_list(l_pos).count loop
- 1672
l_result.extend;
- 1672
l_result(l_result.last) := a_list(l_pos)(i);
end loop;
- 1636
l_pos := a_list.next(l_pos);
end loop;
- 8368
return l_result;
end;
function add_executables(
a_owner t_object_name,
a_package_name t_object_name,
a_annotation_texts tt_annotation_texts,
a_event_name ut_event_manager.t_event_name
) return tt_executables is
l_executables ut_executables;
l_result tt_executables;
l_annotation_pos binary_integer;
l_procedures_list ut_varchar2_list;
l_procedures_pos binary_integer;
l_components_list ut_varchar2_list;
begin
- 543
l_annotation_pos := a_annotation_texts.first;
- 1103
while l_annotation_pos is not null loop
- 560
l_procedures_list :=
ut_utils.filter_list(
ut_utils.trim_list_elements(
ut_utils.string_to_table(a_annotation_texts(l_annotation_pos), ',')
)
, '[[:alpha:]]+'
);
- 560
l_procedures_pos := l_procedures_list.first;
- 560
l_executables := ut_executables();
- 1144
while l_procedures_pos is not null loop
- 584
l_components_list := ut_utils.string_to_table(l_procedures_list(l_procedures_pos), '.');
- 584
l_executables.extend;
- 584
l_executables(l_executables.last) :=
- 1
case(l_components_list.count())
- 1
when 1 then
ut_executable(a_owner, a_package_name, l_components_list(1), a_event_name)
- 1
when 2 then
ut_executable(a_owner,l_components_list(1), l_components_list(2), a_event_name)
- 1
when 3 then
ut_executable(l_components_list(1), l_components_list(2), l_components_list(3), a_event_name)
else
null
end;
- 584
l_procedures_pos := l_procedures_list.next(l_procedures_pos);
end loop;
- 560
l_result(l_annotation_pos) := l_executables;
- 560
l_annotation_pos := a_annotation_texts.next(l_annotation_pos);
end loop;
- 543
return l_result;
end;
procedure warning_on_duplicate_annot(
a_suite in out nocopy ut_suite_item,
a_annotations tt_annotations_by_name,
a_for_annotation varchar2,
a_procedure_name t_object_name := null
) is
l_line_no binary_integer;
begin
- 8204
if a_annotations.exists(a_for_annotation) and a_annotations(a_for_annotation).count > 1 then
--start from second occurrence of annotation
- 14
l_line_no := a_annotations(a_for_annotation).next( a_annotations(a_for_annotation).first );
- 28
while l_line_no is not null loop
- 14
add_annotation_ignored_warning( a_suite, a_for_annotation, 'Duplicate annotation %%%.', l_line_no, a_procedure_name );
- 14
l_line_no := a_annotations(a_for_annotation).next( l_line_no );
end loop;
end if;
end;
procedure warning_bad_annot_combination(
a_suite in out nocopy ut_suite_item,
a_procedure_name t_object_name,
a_proc_annotations tt_annotations_by_name,
a_for_annotation varchar2,
a_invalid_annotations ut_varchar2_list
) is
l_annotation_name t_annotation_name;
l_line_no binary_integer;
begin
- 2417
if a_proc_annotations.exists(a_for_annotation) then
- 2417
l_annotation_name := a_proc_annotations.first;
- 5359
while l_annotation_name is not null loop
- 2942
if l_annotation_name member of a_invalid_annotations then
- 4
l_line_no := a_proc_annotations(l_annotation_name).first;
- 8
while l_line_no is not null loop
- 4
add_annotation_ignored_warning(
a_suite, l_annotation_name, 'Annotation %%% cannot be used with "--%'|| a_for_annotation || '".',
l_line_no, a_procedure_name
);
- 4
l_line_no := a_proc_annotations(l_annotation_name).next(l_line_no);
end loop;
end if;
- 2942
l_annotation_name := a_proc_annotations.next(l_annotation_name);
end loop;
end if;
end;
procedure add_test(
a_suite in out nocopy ut_suite,
a_suite_items in out nocopy ut_suite_items,
a_procedure_name t_object_name,
a_annotations t_annotations_info
) is
l_test ut_test;
l_annotation_texts tt_annotation_texts;
- 2646
l_proc_annotations tt_annotations_by_name := a_annotations.by_proc(a_procedure_name);
begin
- 2646
if not l_proc_annotations.exists(gc_test) then
- 229
return;
end if;
- 2417
warning_on_duplicate_annot( a_suite, l_proc_annotations, gc_test, a_procedure_name);
- 2417
warning_on_duplicate_annot( a_suite, l_proc_annotations, gc_displayname, a_procedure_name);
- 2417
warning_on_duplicate_annot( a_suite, l_proc_annotations, gc_rollback, a_procedure_name);
- 2417
warning_bad_annot_combination(
a_suite, a_procedure_name, l_proc_annotations, gc_test,
ut_varchar2_list(gc_beforeeach, gc_aftereach, gc_beforeall, gc_afterall)
);
- 2417
l_test := ut_test(a_suite.object_owner, a_suite.object_name, a_procedure_name, l_proc_annotations( gc_test).first);
- 2417
l_test.parse_time := a_annotations.parse_time;
- 2417
if l_proc_annotations.exists( gc_displayname) then
- 5
l_annotation_texts := l_proc_annotations( gc_displayname);
--take the last definition if more than one was provided
- 5
l_test.description := l_annotation_texts(l_annotation_texts.first);
--TODO if more than one - warning
else
- 2412
l_test.description := l_proc_annotations(gc_test)(l_proc_annotations(gc_test).first);
end if;
- 2417
l_test.path := a_suite.path ||'.'||a_procedure_name;
- 2417
if l_proc_annotations.exists(gc_rollback) then
- 1
l_annotation_texts := l_proc_annotations(gc_rollback);
- 1
l_test.rollback_type := get_rollback_type(l_annotation_texts(l_annotation_texts.first));
- 1
if l_test.rollback_type is null then
add_annotation_ignored_warning(
a_suite, gc_rollback, 'Annotation %%% must be provided with one of values: "auto" or "manual".',
l_annotation_texts.first, a_procedure_name
);
end if;
end if;
- 2417
if l_proc_annotations.exists( gc_beforetest) then
- 215
l_test.before_test_list := convert_list(
add_executables( l_test.object_owner, l_test.object_name, l_proc_annotations( gc_beforetest ), gc_beforetest )
);
- 215
set_seq_no(l_test.before_test_list);
end if;
- 2417
if l_proc_annotations.exists( gc_aftertest) then
- 213
l_test.after_test_list := convert_list(
add_executables( l_test.object_owner, l_test.object_name, l_proc_annotations( gc_aftertest ), gc_aftertest )
);
- 213
set_seq_no(l_test.after_test_list);
end if;
- 2417
if l_proc_annotations.exists( gc_tags) then
- 33
add_tags_to_suite_item(a_suite, l_proc_annotations( gc_tags), l_test.tags, a_procedure_name);
end if;
- 2417
if l_proc_annotations.exists( gc_throws) then
- 33
add_to_throws_numbers_list(a_suite, l_test.expected_error_codes, a_procedure_name, l_proc_annotations( gc_throws));
end if;
- 2417
l_test.disabled_flag := ut_utils.boolean_to_int( l_proc_annotations.exists( gc_disabled));
- 2417
a_suite_items.extend;
- 2417
a_suite_items( a_suite_items.last ) := l_test;
end;
procedure propagate_before_after_each(
a_suite_items in out nocopy ut_suite_items,
a_before_each_list tt_executables,
a_after_each_list tt_executables
) is
l_test ut_test;
l_context ut_logical_suite;
begin
- 619
if a_suite_items is not null then
- 4322
for i in 1 .. a_suite_items.count loop
- 3703
if a_suite_items(i) is of (ut_test) then
- 3527
l_test := treat( a_suite_items(i) as ut_test);
- 3527
l_test.before_each_list := convert_list(a_before_each_list) multiset union all l_test.before_each_list;
- 3527
set_seq_no(l_test.before_each_list);
- 3527
l_test.after_each_list := l_test.after_each_list multiset union all convert_list(a_after_each_list);
- 3527
set_seq_no(l_test.after_each_list);
- 3527
a_suite_items(i) := l_test;
- 176
elsif a_suite_items(i) is of (ut_logical_suite) then
- 176
l_context := treat(a_suite_items(i) as ut_logical_suite);
- 176
propagate_before_after_each( l_context.items, a_before_each_list, a_after_each_list);
- 176
a_suite_items(i) := l_context;
end if;
end loop;
end if;
end;
procedure process_before_after_annot(
a_list in out nocopy tt_executables,
a_annotation_name t_annotation_name,
a_procedure_name t_object_name,
a_proc_annotations tt_annotations_by_name,
a_suite in out nocopy ut_suite
) is
begin
- 10584
if a_proc_annotations.exists(a_annotation_name) and not a_proc_annotations.exists(gc_test) then
- 231
a_list( a_proc_annotations(a_annotation_name).first ) := ut_executables(ut_executable(a_suite.object_owner, a_suite.object_name, a_procedure_name, a_annotation_name));
- 231
warning_on_duplicate_annot(a_suite, a_proc_annotations, a_annotation_name, a_procedure_name);
--TODO add warning if annotation has text - text ignored
end if;
end;
procedure get_annotated_procedures(
a_proc_annotations t_annotations_info,
a_suite in out nocopy ut_suite,
a_suite_items in out nocopy ut_suite_items,
a_before_each_list in out nocopy tt_executables,
a_after_each_list in out nocopy tt_executables,
a_before_all_list in out nocopy tt_executables,
a_after_all_list in out nocopy tt_executables
) is
l_procedure_name t_object_name;
begin
- 443
l_procedure_name := a_proc_annotations.by_proc.first;
- 3089
while l_procedure_name is not null loop
- 2646
add_test( a_suite, a_suite_items, l_procedure_name, a_proc_annotations );
- 2646
process_before_after_annot(a_before_each_list, gc_beforeeach, l_procedure_name, a_proc_annotations.by_proc(l_procedure_name), a_suite);
- 2646
process_before_after_annot(a_after_each_list, gc_aftereach, l_procedure_name, a_proc_annotations.by_proc(l_procedure_name), a_suite);
- 2646
process_before_after_annot(a_before_all_list, gc_beforeall, l_procedure_name, a_proc_annotations.by_proc(l_procedure_name), a_suite);
- 2646
process_before_after_annot(a_after_all_list, gc_afterall, l_procedure_name, a_proc_annotations.by_proc(l_procedure_name), a_suite);
- 2646
l_procedure_name := a_proc_annotations.by_proc.next( l_procedure_name );
end loop;
end;
procedure build_suitepath(
a_suite in out nocopy ut_suite,
a_annotations t_annotations_info
) is
l_annotation_text t_annotation_text;
begin
- 269
if a_annotations.by_name.exists(gc_suitepath) then
- 169
l_annotation_text := trim(a_annotations.by_name(gc_suitepath)(a_annotations.by_name(gc_suitepath).first));
- 169
if l_annotation_text is not null then
- 167
if regexp_like(l_annotation_text,'^((\w|[$#])+\.)*(\w|[$#])+$') then
- 166
a_suite.path := l_annotation_text||'.'||a_suite.object_name;
else
- 1
add_annotation_ignored_warning(
a_suite, gc_suitepath||'('||l_annotation_text||')',
'Invalid path value in annotation %%%.', a_annotations.by_name(gc_suitepath).first
);
end if;
else
- 2
add_annotation_ignored_warning(
a_suite, gc_suitepath, '%%% annotation requires a non-empty parameter value.',
a_annotations.by_name(gc_suitepath).first
);
end if;
- 167
warning_on_duplicate_annot(a_suite, a_annotations.by_name, gc_suitepath);
end if;
- 267
a_suite.path := lower(coalesce(a_suite.path, a_suite.object_name));
end;
procedure add_suite_tests(
a_suite in out nocopy ut_suite,
a_annotations t_annotations_info,
a_suite_items in out nocopy ut_suite_items
) is
l_before_each_list tt_executables;
l_after_each_list tt_executables;
l_before_all_list tt_executables;
l_after_all_list tt_executables;
l_rollback_type ut_utils.t_rollback_type;
l_annotation_text t_annotation_text;
begin
- 443
if a_annotations.by_name.exists(gc_displayname) then
- 89
l_annotation_text := trim(a_annotations.by_name(gc_displayname)(a_annotations.by_name(gc_displayname).first));
- 89
if l_annotation_text is not null then
- 88
a_suite.description := l_annotation_text;
else
- 1
add_annotation_ignored_warning(
a_suite, gc_displayname, '%%% annotation requires a non-empty parameter value.',
a_annotations.by_name(gc_displayname).first
);
end if;
- 89
warning_on_duplicate_annot(a_suite, a_annotations.by_name, gc_displayname);
end if;
- 443
if a_annotations.by_name.exists(gc_rollback) then
- 21
l_rollback_type := get_rollback_type(a_annotations.by_name(gc_rollback)(a_annotations.by_name(gc_rollback).first));
- 21
if l_rollback_type is null then
- 2
add_annotation_ignored_warning(
a_suite, gc_rollback, '%%% annotation requires one of values as parameter: "auto" or "manual".',
a_annotations.by_name(gc_rollback).first
);
end if;
- 21
warning_on_duplicate_annot(a_suite, a_annotations.by_name, gc_rollback);
end if;
- 443
if a_annotations.by_name.exists(gc_beforeall) then
- 52
l_before_all_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_beforeall), gc_beforeall );
end if;
- 443
if a_annotations.by_name.exists(gc_afterall) then
- 52
l_after_all_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_afterall), gc_afterall );
end if;
- 443
if a_annotations.by_name.exists(gc_beforeeach) then
- 4
l_before_each_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_beforeeach), gc_beforeeach );
end if;
- 443
if a_annotations.by_name.exists(gc_aftereach) then
- 7
l_after_each_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_aftereach), gc_aftereach );
end if;
- 443
if a_annotations.by_name.exists(gc_tags) then
- 22
add_tags_to_suite_item(a_suite, a_annotations.by_name(gc_tags),a_suite.tags);
end if;
- 443
a_suite.disabled_flag := ut_utils.boolean_to_int(a_annotations.by_name.exists(gc_disabled));
--process procedure annotations for suite
- 443
get_annotated_procedures(a_annotations, a_suite, a_suite_items, l_before_each_list, l_after_each_list, l_before_all_list, l_after_all_list);
- 443
a_suite.set_rollback_type(l_rollback_type);
- 443
propagate_before_after_each( a_suite_items, l_before_each_list, l_after_each_list);
- 443
a_suite.before_all_list := convert_list(l_before_all_list);
- 443
set_seq_no(a_suite.before_all_list);
- 443
a_suite.after_all_list := convert_list(l_after_all_list);
- 443
set_seq_no(a_suite.after_all_list);
end;
function get_endcontext_position(
a_context_ann_pos t_annotation_position,
a_package_annotations in out nocopy tt_annotations_by_name
) return t_annotation_position is
l_result t_annotation_position;
begin
- 179
if a_package_annotations.exists(gc_endcontext) then
- 177
l_result := a_package_annotations(gc_endcontext).first;
- 177
while l_result <= a_context_ann_pos loop
l_result := a_package_annotations(gc_endcontext).next(l_result);
end loop;
end if;
- 179
return l_result;
end;
function get_annotations_in_context(
a_annotations t_annotations_info,
a_context_pos t_annotation_position,
a_end_context_pos t_annotation_position
) return t_annotations_info is
l_result t_annotations_info;
l_position t_annotation_position;
l_procedure_name t_object_name;
l_annotation_name t_annotation_name;
l_annotation_text t_annotation_text;
begin
- 177
l_position := a_context_pos;
- 177
l_result.owner := a_annotations.owner;
- 177
l_result.name := a_annotations.name;
- 177
l_result.parse_time := a_annotations.parse_time;
- 2037
while l_position is not null and l_position <= a_end_context_pos loop
- 1860
l_result.by_line(l_position) := a_annotations.by_line(l_position);
- 1860
l_procedure_name := l_result.by_line(l_position).procedure_name;
- 1860
l_annotation_name := l_result.by_line(l_position).name;
- 1860
l_annotation_text := l_result.by_line(l_position).text;
- 1860
if l_procedure_name is not null then
- 1330
l_result.by_proc(l_procedure_name)(l_annotation_name)(l_position) := l_annotation_text;
else
- 530
l_result.by_name(l_annotation_name)(l_position) := l_annotation_text;
end if;
- 1860
l_position := a_annotations.by_line.next(l_position);
end loop;
- 177
return l_result;
end;
procedure get_suite_contexts_items(
a_suite in out nocopy ut_suite,
a_annotations in out nocopy t_annotations_info,
a_suite_items out nocopy ut_suite_items
) is
l_context_pos t_annotation_position;
l_end_context_pos t_annotation_position;
l_context_name t_object_name;
l_ctx_annotations t_annotations_info;
l_context ut_suite_context;
- 267
l_context_no binary_integer := 1;
l_context_items ut_suite_items;
type tt_context_names is table of boolean index by t_object_name;
l_context_names tt_context_names;
begin
- 267
a_suite_items := ut_suite_items();
- 267
if not a_annotations.by_name.exists(gc_context) then
- 204
return;
end if;
- 63
l_context_pos := a_annotations.by_name( gc_context).first;
- 179
while l_context_pos is not null loop
- 179
l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_name );
- 179
exit when l_end_context_pos is null;
- 177
l_context_items := ut_suite_items();
--create a sub-set of annotations to process as sub-suite (context)
- 177
l_ctx_annotations := get_annotations_in_context( a_annotations, l_context_pos, l_end_context_pos);
- 177
l_context_name := coalesce(
- 1
l_ctx_annotations.by_line( l_context_pos ).text
, gc_context||'_'||l_context_no
);
- 177
if l_context_names.exists(l_context_name) then
- 1
add_annotation_ignored_warning( a_suite, 'context', 'Context name must be unique in a suite. Context and all of it''s content ignored.', l_context_pos );
else
- 176
l_context_names(l_context_name) := true;
- 176
l_context := ut_suite_context(a_suite.object_owner, a_suite.object_name, l_context_name, l_context_pos );
- 176
l_context.path := a_suite.path||'.'||l_context_name;
- 176
l_context.description := l_ctx_annotations.by_line( l_context_pos ).text;
- 176
l_context.parse_time := a_annotations.parse_time;
- 176
warning_on_duplicate_annot( l_context, l_ctx_annotations.by_name, gc_context );
- 176
add_suite_tests( l_context, l_ctx_annotations, l_context_items );
- 176
add_items_to_list(a_suite_items, l_context_items);
- 176
a_suite_items.extend;
- 176
a_suite_items(a_suite_items.last) := l_context;
end if;
-- remove annotations within context after processing them
- 177
delete_annotations_range(a_annotations, l_context_pos, l_end_context_pos);
- 177
exit when not a_annotations.by_name.exists( gc_context);
- 116
l_context_pos := a_annotations.by_name( gc_context).next( l_context_pos);
- 116
l_context_no := l_context_no + 1;
end loop;
end;
procedure warning_on_incomplete_context(
a_suite in out nocopy ut_suite,
a_package_ann_index tt_annotations_by_name
) is
l_annotation_pos t_annotation_position;
begin
- 267
if a_package_ann_index.exists(gc_context) then
- 2
l_annotation_pos := a_package_ann_index(gc_context).first;
- 4
while l_annotation_pos is not null loop
- 2
add_annotation_ignored_warning(
a_suite, gc_context, 'Invalid annotation %%%. Cannot find following "--%endcontext".',
l_annotation_pos
);
- 2
l_annotation_pos := a_package_ann_index(gc_context).next(l_annotation_pos);
end loop;
end if;
- 267
if a_package_ann_index.exists(gc_endcontext) then
- 1
l_annotation_pos := a_package_ann_index(gc_endcontext).first;
- 2
while l_annotation_pos is not null loop
- 1
add_annotation_ignored_warning(
a_suite, gc_endcontext, 'Invalid annotation %%%. Cannot find preceding "--%context".',
l_annotation_pos
);
- 1
l_annotation_pos := a_package_ann_index(gc_endcontext).next(l_annotation_pos);
end loop;
end if;
end;
procedure warning_on_unknown_annotations(
a_suite in out nocopy ut_suite_item,
a_annotations tt_annotations_by_line
) is
- 269
l_line_no t_annotation_position := a_annotations.first;
begin
- 4525
while l_line_no is not null loop
- 4256
if a_annotations(l_line_no).name not member of (gc_supported_annotations) then
- 2
add_annotation_ignored_warning(
a_suite,
a_annotations(l_line_no).name,
'Unsupported annotation %%%.',
l_line_no,
a_annotations(l_line_no).procedure_name
);
end if;
- 4256
l_line_no := a_annotations.next(l_line_no);
end loop;
end;
function convert_package_annotations(a_object ut_annotated_object) return t_annotations_info is
l_result t_annotations_info;
l_annotation t_annotation;
l_annotation_no binary_integer;
l_annotation_pos binary_integer;
begin
- 274
l_result.owner := a_object.object_owner;
- 274
l_result.name := lower(trim(a_object.object_name));
- 274
l_result.parse_time := a_object.parse_time;
- 274
l_annotation_no := a_object.annotations.first;
- 4542
while l_annotation_no is not null loop
- 4268
l_annotation_pos := a_object.annotations(l_annotation_no).position;
- 4268
l_annotation.name := a_object.annotations(l_annotation_no).name;
- 4268
l_annotation.text := a_object.annotations(l_annotation_no).text;
- 4268
l_annotation.procedure_name := lower(trim(a_object.annotations(l_annotation_no).subobject_name));
- 4268
l_result.by_line( l_annotation_pos) := l_annotation;
- 4268
if l_annotation.procedure_name is null then
- 1063
l_result.by_name( l_annotation.name)( l_annotation_pos) := l_annotation.text;
else
- 3205
l_result.by_proc(l_annotation.procedure_name)(l_annotation.name)(l_annotation_pos) := l_annotation.text;
end if;
- 4268
l_annotation_no := a_object.annotations.next(l_annotation_no);
end loop;
- 274
return l_result;
end;
procedure create_suite_item_list( a_annotated_object ut_annotated_object, a_suite_items out nocopy ut_suite_items ) is
l_annotations t_annotations_info;
l_annotation_pos t_annotation_position;
l_suite ut_suite;
begin
- 274
l_annotations := convert_package_annotations( a_annotated_object );
- 274
if l_annotations.by_name.exists(gc_suite) then
- 269
l_annotation_pos := l_annotations.by_name(gc_suite).first;
- 269
l_suite := ut_suite(l_annotations.owner, l_annotations.name, l_annotation_pos);
- 269
l_suite.description := l_annotations.by_name( gc_suite)( l_annotation_pos);
- 269
l_suite.parse_time := l_annotations.parse_time;
- 269
warning_on_unknown_annotations(l_suite, l_annotations.by_line);
- 269
warning_on_duplicate_annot( l_suite, l_annotations.by_name, gc_suite );
- 269
build_suitepath( l_suite, l_annotations );
- 267
get_suite_contexts_items( l_suite, l_annotations, a_suite_items );
--create suite tests and add
- 267
add_suite_tests( l_suite, l_annotations, a_suite_items );
--by this time all contexts were consumed and l_annotations should not have any context/endcontext annotation in it.
- 267
warning_on_incomplete_context( l_suite, l_annotations.by_name );
- 267
a_suite_items.extend;
- 267
a_suite_items( a_suite_items.last) := l_suite;
end if;
end;
end ut_suite_builder;
UT3.UT_SUITE_CACHE_MANAGER
96.92 % lines covered
65 relevant lines. 63 lines covered and 2 lines missed
package body ut_suite_cache_manager is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
/*
* Private code
*/
- 1
gc_get_cache_suite_sql constant varchar2(32767) :=
q'[with
suite_items as (
select /*+ cardinality(c 500) */ value(c) as obj
from ut_suite_cache c
where 1 = 1
and c.object_owner = :l_object_owner
and ( {:path:}
and {:object_name:}
and {:procedure_name:}
)
)
),
{:tags:}
suitepaths as (
select distinct substr(c.obj.path,1,instr(c.obj.path,'.',-1)-1) as suitepath,
c.obj.path as path,
c.obj.object_owner as object_owner
from {:suite_item_name:} c
where c.obj.self_type = 'UT_SUITE'
),
gen as (
select rownum as pos
from xmltable('1 to 20')
),
suitepath_part AS (
select distinct
substr(b.suitepath, 1, instr(b.suitepath || '.', '.', 1, g.pos) -1) as path,
object_owner
from suitepaths b
join gen g
on g.pos <= regexp_count(b.suitepath, '\w+')
),
logical_suite_data as (
select 'UT_LOGICAL_SUITE' as self_type, p.path, p.object_owner,
upper( substr(p.path, instr( p.path, '.', -1 ) + 1 ) ) as object_name,
cast(null as ut_executables) as x,
cast(null as ut_integer_list) as y,
cast(null as ut_executable_test) as z
from suitepath_part p
where p.path
not in (select s.path from suitepaths s)
),
logical_suites as (
select ut_suite_cache_row(
null,
s.self_type, s.path, s.object_owner, s.object_name,
s.object_name, null, null, null, null, 0,
ut_varchar2_rows(),
s.x, s.x, s.x, s.x, s.x, s.x,
s.y, null, s.z
) as obj
from logical_suite_data s
),
items as (
select obj from {:suite_item_name:}
union all
select obj from logical_suites
)
select c.obj
from items c
order by c.obj.object_owner,{:random_seed:}]';
function get_missing_cache_objects(a_object_owner varchar2) return ut_varchar2_rows is
l_result ut_varchar2_rows;
l_data ut_annotation_objs_cache_info;
begin
- 301
l_data := ut_annotation_cache_manager.get_cached_objects_list(a_object_owner, 'PACKAGE');
- 301
select i.object_name
bulk collect into l_result
from ut_suite_cache_package i
where not exists (
select 1 from table(l_data) o
where o.object_owner = i.object_owner
and o.object_name = i.object_name
and o.object_type = 'PACKAGE'
)
and i.object_owner = a_object_owner;
- 301
return l_result;
end;
function get_path_sql(a_path in varchar2) return varchar2 is
begin
- 215
return case when a_path is not null then q'[
:l_path||'.' like c.path || '.%' /*all children and self*/
or ( c.path||'.' like :l_path || '.%' --all parents
]'
else ' :l_path is null and ( :l_path is null ' end;
end;
function get_object_name_sql(a_object_name in varchar2) return varchar2 is
begin
- 215
return case when a_object_name is not null
then ' c.object_name = :a_object_name '
else ' :a_object_name is null' end;
end;
function get_procedure_name_sql(a_procedure_name in varchar2) return varchar2 is
begin
- 215
return case when a_procedure_name is not null
then ' c.name = :a_procedure_name'
else ' :a_procedure_name is null' end;
end;
function get_tags_sql(a_tags_count in integer) return varchar2 is
begin
- 215
return case when a_tags_count > 0 then
q'[filter_tags as (
select c.obj.path as path
from suite_items c
where c.obj.tags multiset intersect :a_tag_list is not empty
),
suite_items_tags as (
select c.*
from suite_items c
where exists (
select 1 from filter_tags t
where t.path||'.' like c.obj.path || '.%' /*all children and self*/
or c.obj.path||'.' like t.path || '.%' --all parents
)
),]'
else
q'[dummy as (select 'x' from dual where :a_tag_list is null ),]'
end;
end;
function get_random_seed_sql(a_random_seed positive) return varchar2 is
begin
- 215
return case
- 1
when a_random_seed is null then q'[
replace(
case
when c.obj.self_type in ( 'UT_TEST' )
then substr(c.obj.path, 1, instr(c.obj.path, '.', -1) )
else c.obj.path
end, '.', chr(0)
) desc nulls last,
c.obj.object_name desc,
c.obj.line_no,
:a_random_seed]'
else
' ut_runner.hash_suite_path(
c.obj.path, :a_random_seed
) desc nulls last'
end;
end;
/*
* Public code
*/
function get_cached_suite_rows(
a_object_owner varchar2,
a_path varchar2 := null,
a_object_name varchar2 := null,
a_procedure_name varchar2 := null,
a_random_seed positive := null,
a_tags ut_varchar2_rows := null
) return ut_suite_cache_rows is
l_path varchar2(4000);
- 215
l_results ut_suite_cache_rows := ut_suite_cache_rows();
l_sql varchar2(32767);
l_suite_item_name varchar2(20);
- 215
l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows());
- 215
l_object_owner varchar2(250) := ut_utils.qualified_sql_name(a_object_owner);
- 215
l_object_name varchar2(250) := ut_utils.qualified_sql_name(a_object_name);
- 215
l_procedure_name varchar2(250) := ut_utils.qualified_sql_name(a_procedure_name);
begin
- 215
if a_path is null and a_object_name is not null then
- 165
select min(c.path)
into l_path
from ut_suite_cache c
where c.object_owner = upper(l_object_owner)
and c.object_name = upper(l_object_name)
and c.name = nvl(upper(l_procedure_name), c.name);
else
- 50
l_path := lower(ut_utils.qualified_sql_name(a_path));
end if;
- 215
l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end;
- 215
l_sql := gc_get_cache_suite_sql;
- 215
l_sql := replace(l_sql,'{:suite_item_name:}',l_suite_item_name);
- 215
l_sql := replace(l_sql,'{:object_owner:}',upper(l_object_owner));
- 215
l_sql := replace(l_sql,'{:path:}',get_path_sql(l_path));
- 215
l_sql := replace(l_sql,'{:object_name:}',get_object_name_sql(l_object_name));
- 215
l_sql := replace(l_sql,'{:procedure_name:}',get_procedure_name_sql(l_procedure_name));
- 215
l_sql := replace(l_sql,'{:tags:}',get_tags_sql(l_tags.count));
- 215
l_sql := replace(l_sql,'{:random_seed:}',get_random_seed_sql(a_random_seed));
- 215
ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_key_anyvalues().put('l_sql',l_sql) );
- 215
execute immediate l_sql
bulk collect into l_results
using upper(l_object_owner), l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed;
- 215
return l_results;
end;
function get_schema_parse_time(a_schema_name varchar2) return timestamp result_cache is
l_cache_parse_time timestamp;
begin
- 302
select min(t.parse_time)
into l_cache_parse_time
from ut_suite_cache_schema t
where object_owner = upper(a_schema_name);
- 302
return l_cache_parse_time;
end;
procedure save_object_cache(
a_object_owner varchar2,
a_object_name varchar2,
a_parse_time timestamp,
a_suite_items ut_suite_items
) is
pragma autonomous_transaction;
l_cached_parse_time timestamp;
- 274
l_object_owner varchar2(250) := upper(a_object_owner);
- 274
l_object_name varchar2(250) := upper(a_object_name);
begin
- 274
if a_suite_items is not null and a_suite_items.count = 0 then
delete from ut_suite_cache t
where t.object_owner = l_object_owner
and t.object_name = l_object_name;
delete from ut_suite_cache_package t
where t.object_owner = l_object_owner
and t.object_name = l_object_name;
else
- 274
select min(parse_time)
into l_cached_parse_time
from ut_suite_cache_package t
where t.object_name = l_object_name
and t.object_owner = l_object_owner;
- 274
if a_parse_time > l_cached_parse_time or l_cached_parse_time is null then
- 274
update ut_suite_cache_schema t
set t.parse_time = a_parse_time
where object_owner = l_object_owner;
- 274
if sql%rowcount = 0 then
- 4
insert into ut_suite_cache_schema
(object_owner, parse_time)
values (l_object_owner, a_parse_time);
end if;
- 274
update ut_suite_cache_package t
set t.parse_time = a_parse_time
where t.object_owner = l_object_owner
and t.object_name = l_object_name;
- 274
if sql%rowcount = 0 then
- 111
insert into ut_suite_cache_package
(object_owner, object_name, parse_time)
values (l_object_owner, l_object_name, a_parse_time );
end if;
- 274
delete from ut_suite_cache t
where t.object_owner = l_object_owner
and t.object_name = l_object_name;
- 274
insert into ut_suite_cache t
(
id, self_type, path, object_owner, object_name, name,
line_no, parse_time, description,
rollback_type, disabled_flag, warnings,
before_all_list, after_all_list,
before_each_list, after_each_list,
before_test_list, after_test_list,
expected_error_codes, tags,
item
)
with suites as (
select treat(value(x) as ut_suite) i
from table(a_suite_items) x
where x.self_type in( 'UT_SUITE', 'UT_SUITE_CONTEXT' ) )
select ut_suite_cache_seq.nextval, s.i.self_type as self_type, s.i.path as path,
upper(s.i.object_owner) as object_owner, upper(s.i.object_name) as object_name, upper(s.i.name) as name,
s.i.line_no as line_no, s.i.parse_time as parse_time, s.i.description as description,
s.i.rollback_type as rollback_type, s.i.disabled_flag as disabled_flag, s.i.warnings as warnings,
s.i.before_all_list as before_all_list, s.i.after_all_list as after_all_list,
null before_each_list, null after_each_list,
null before_test_list, null after_test_list,
null expected_error_codes, s.i.tags tags,
null item
from suites s;
- 274
insert into ut_suite_cache t
(
id, self_type, path, object_owner, object_name, name,
line_no, parse_time, description,
rollback_type, disabled_flag, warnings,
before_all_list, after_all_list,
before_each_list, after_each_list,
before_test_list, after_test_list,
expected_error_codes, tags,
item
)
with tests as (
select treat(value(x) as ut_test) t
from table ( a_suite_items ) x
where x.self_type in ( 'UT_TEST' ) )
select ut_suite_cache_seq.nextval, s.t.self_type as self_type, s.t.path as path,
upper(s.t.object_owner) as object_owner, upper(s.t.object_name) as object_name, upper(s.t.name) as name,
s.t.line_no as line_no, s.t.parse_time as parse_time, s.t.description as description,
s.t.rollback_type as rollback_type, s.t.disabled_flag as disabled_flag, s.t.warnings as warnings,
null before_all_list, null after_all_list,
s.t.before_each_list as before_each_list, s.t.after_each_list as after_each_list,
s.t.before_test_list as before_test_list, s.t.after_test_list as after_test_list,
s.t.expected_error_codes as expected_error_codes, s.t.tags as test_tags,
s.t.item as item
from tests s;
end if;
end if;
- 274
commit;
end;
procedure remove_missing_objs_from_cache(a_schema_name varchar2) is
l_objects ut_varchar2_rows;
pragma autonomous_transaction;
begin
- 301
l_objects := get_missing_cache_objects(a_schema_name);
- 301
if l_objects is not empty then
- 36
delete from ut_suite_cache i
where i.object_owner = a_schema_name
and i.object_name in ( select column_value from table (l_objects) );
- 36
delete from ut_suite_cache_package i
where i.object_owner = a_schema_name
and i.object_name in ( select column_value from table (l_objects) );
end if;
- 301
commit;
end;
function get_cached_suite_info(
a_object_owner varchar2,
a_object_name varchar2
) return ut_suite_items_info is
l_cache_rows ut_suite_cache_rows;
l_results ut_suite_items_info;
begin
- 3
l_cache_rows := get_cached_suite_rows( a_object_owner => a_object_owner, a_object_name =>a_object_name );
- 2
select ut_suite_item_info(
c.object_owner, c.object_name, c.name,
c.description, c.self_type, c.line_no,
c.path, c.disabled_flag, c.tags
)
bulk collect into l_results
from table(l_cache_rows) c;
- 3
return l_results;
end;
function get_cached_packages(
a_schema_names ut_varchar2_rows
) return ut_object_names is
l_results ut_object_names;
begin
- 116
select ut_object_name( c.object_owner, c.object_name )
bulk collect into l_results
from ut_suite_cache_package c
join table ( a_schema_names ) s
on c.object_owner = upper(s.column_value);
- 117
return l_results;
end;
function suite_item_exists(
a_owner_name varchar2,
a_package_name varchar2,
a_procedure_name varchar2
) return boolean is
l_count integer;
begin
- 12
if a_procedure_name is not null then
- 4
select count( 1 ) into l_count from dual
where exists(
select 1
from ut_suite_cache c
where c.object_owner = a_owner_name
and c.object_name = a_package_name
and c.name = a_procedure_name
);
- 8
elsif a_package_name is not null then
- 4
select count( 1 ) into l_count from dual
where exists(
select 1
from ut_suite_cache c
where c.object_owner = a_owner_name
and c.object_name = a_package_name
);
else
- 4
select count( 1 ) into l_count from dual
where exists(
select 1
from ut_suite_cache c
where c.object_owner = a_owner_name
);
end if;
- 12
return l_count > 0;
end;
end;
UT3.UT_SUITE_MANAGER
94.68 % lines covered
188 relevant lines. 178 lines covered (including 3 lines partially covered ) and 10 lines missed
package body ut_suite_manager is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 1
gc_suitpath_error_message constant varchar2(100) := 'Suitepath exceeds 1000 CHAR on: ';
type t_path_item is record (
object_name varchar2(250),
procedure_name varchar2(250),
suite_path varchar2(4000)
);
type t_path_items is table of t_path_item;
type t_schema_paths is table of t_path_items index by varchar2(250 char);
cursor c_cached_suites_cursor is select * from table(ut_suite_cache_rows());
type tt_cached_suites is table of c_cached_suites_cursor%rowtype;
type t_cached_suites_cursor is ref cursor return c_cached_suites_cursor%rowtype;
type t_item_levels is table of ut_suite_items index by binary_integer;
------------------
procedure validate_paths(a_paths in ut_varchar2_list) is
l_path varchar2(32767);
begin
- 263
if a_paths is null or a_paths.count = 0 then
raise_application_error(ut_utils.gc_path_list_is_empty, 'Path list is empty');
else
- 548
for i in 1 .. a_paths.count loop
- 285
l_path := a_paths(i);
- 285
if l_path is null or not (regexp_like(l_path, '^[A-Za-z0-9$#_]+(\.[A-Za-z0-9$#_]+){0,2}$') or regexp_like(l_path, '^([A-Za-z0-9$#_]+)?:[A-Za-z0-9$#_]+(\.[A-Za-z0-9$#_]+)*$')) then
raise_application_error(ut_utils.gc_invalid_path_format, 'Invalid path format: ' || nvl(l_path, 'NULL'));
end if;
end loop;
end if;
end;
function trim_and_lower_paths( a_paths ut_varchar2_list) return ut_varchar2_list is
- 263
l_paths_temp ut_varchar2_list := ut_varchar2_list();
begin
- 263
l_paths_temp.extend(a_paths.count);
- 548
for i in 1 .. a_paths.count loop
- 285
l_paths_temp(i) := trim(lower(a_paths(i)));
end loop;
- 263
return l_paths_temp;
end;
function resolve_schema_names(a_paths in out nocopy ut_varchar2_list) return ut_varchar2_rows is
l_schema varchar2(4000);
l_object varchar2(4000);
- 263
l_schema_names ut_varchar2_rows := ut_varchar2_rows();
- 263
c_current_schema constant all_tables.owner%type := sys_context('USERENV','CURRENT_SCHEMA');
begin
- 263
a_paths := set( trim_and_lower_paths( a_paths) );
- 263
validate_paths(a_paths);
- 547
for i in 1 .. a_paths.count loop
--if path is suite-path
- 285
if regexp_like(a_paths(i), '^([A-Za-z0-9$#_]+)?:') then
--get schema name / path
- 34
l_schema := regexp_substr(a_paths(i), '^([A-Za-z0-9$#_]+)?:',subexpression => 1);
-- transform ":path1[.path2]" to "schema:path1[.path2]"
- 34
if l_schema is not null then
- 6
l_schema := sys.dbms_assert.schema_name(upper(l_schema));
else
- 28
a_paths(i) := c_current_schema || a_paths(i);
- 28
l_schema := c_current_schema;
end if;
else
-- get schema name / object.[procedure] name
-- When path is one of: schema or schema.package[.object] or package[.object]
-- transform it back to schema[.package[.object]]
begin
- 251
l_object := regexp_substr(a_paths(i), '^[A-Za-z0-9$#_]+');
- 251
l_schema := sys.dbms_assert.schema_name(upper(l_object));
exception
- 270
when sys.dbms_assert.invalid_schema_name then
- 135
if ut_metadata.package_exists_in_cur_schema(upper(l_object)) then
- 134
a_paths(i) := c_current_schema || '.' || a_paths(i);
- 134
l_schema := c_current_schema;
else
- 1
raise;
end if;
end;
end if;
- 284
l_schema_names.extend;
- 284
l_schema_names(l_schema_names.last) := l_schema;
end loop;
- 262
return l_schema_names;
end;
procedure resolve_schema_names(a_paths in out nocopy ut_varchar2_list) is
l_schema_names ut_varchar2_rows;
begin
- 148
l_schema_names := resolve_schema_names(a_paths);
end;
function group_paths_by_schema(a_paths ut_varchar2_list) return t_schema_paths is
- 147
c_package_path_regex constant varchar2(100) := '^([A-Za-z0-9$#_]+)(\.([A-Za-z0-9$#_]+))?(\.([A-Za-z0-9$#_]+))?$';
l_schema varchar2(4000);
l_empty_result t_path_item;
l_result t_path_item;
l_results t_schema_paths;
begin
- 305
for i in 1 .. a_paths.count loop
- 158
l_result := l_empty_result;
- 158
if a_paths(i) like '%:%' then
- 23
l_schema := upper(regexp_substr(a_paths(i),'^[^.:]+'));
- 23
l_result.suite_path := ltrim(regexp_substr(a_paths(i),'[.:].*$'),':');
else
- 135
l_schema := regexp_substr(a_paths(i), c_package_path_regex, subexpression => 1);
- 135
l_result.object_name := regexp_substr(a_paths(i), c_package_path_regex, subexpression => 3);
- 135
l_result.procedure_name := regexp_substr(a_paths(i), c_package_path_regex, subexpression => 5);
end if;
- 158
if l_results.exists(l_schema) then
- 11
l_results(l_schema).extend;
- 11
l_results(l_schema)(l_results(l_schema).last) := l_result;
else
- 147
l_results(l_schema) := t_path_items(l_result);
end if;
end loop;
- 147
return l_results;
end;
function sort_by_seq_no(
a_list ut_executables
) return ut_executables is
- 3302
l_results ut_executables := ut_executables();
begin
- 3302
if a_list is not null then
- 3302
l_results.extend(a_list.count);
- 3856
for i in 1 .. a_list.count loop
- 554
l_results(a_list(i).seq_no) := a_list(i);
end loop;
end if;
- 3302
return l_results;
end;
procedure reverse_list_order(
a_list in out nocopy ut_suite_items
) is
l_start_idx pls_integer;
l_end_idx pls_integer;
l_item ut_suite_item;
begin
- 212
l_start_idx := a_list.first;
- 212
l_end_idx := a_list.last;
- 242
while l_start_idx < l_end_idx loop
- 30
l_item := a_list(l_start_idx);
- 30
a_list(l_start_idx) := a_list(l_end_idx);
- 30
a_list(l_end_idx) := l_item;
- 30
l_end_idx := a_list.prior(l_end_idx);
- 30
l_start_idx := a_list.next(l_start_idx);
end loop;
end;
function get_logical_suite(
a_rows tt_cached_suites,
a_idx pls_integer,
a_level pls_integer,
a_prev_level pls_integer,
a_items_at_level t_item_levels
) return ut_suite_item is
l_result ut_suite_item;
begin
- 1164
case a_rows( a_idx ).self_type
- 1164
when 'UT_SUITE' then
- 290
l_result :=
- 1/2 1
case when a_prev_level > a_level then
ut_suite(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => a_items_at_level(a_prev_level),
before_all_list => sort_by_seq_no( a_rows( a_idx ).before_all_list), after_all_list => sort_by_seq_no(
a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags
)
else
ut_suite(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => ut_suite_items(),
before_all_list => sort_by_seq_no( a_rows( a_idx ).before_all_list), after_all_list => sort_by_seq_no(
a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags
)
end;
- 874
when 'UT_SUITE_CONTEXT' then
- 41
l_result :=
- 1/2 1
case when a_prev_level > a_level then
ut_suite_context(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => a_items_at_level(a_prev_level),
before_all_list => sort_by_seq_no( a_rows( a_idx ).before_all_list), after_all_list => sort_by_seq_no(
a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags
)
else
ut_suite_context(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => ut_suite_items(),
before_all_list => sort_by_seq_no( a_rows( a_idx ).before_all_list), after_all_list => sort_by_seq_no(
a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags
)
end;
- 833
when 'UT_LOGICAL_SUITE' then
- 173
l_result :=
- 1/2 1
case when a_prev_level > a_level then
ut_logical_suite(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => a_items_at_level(a_prev_level), tags => null
)
else
ut_logical_suite(
self_type => a_rows( a_idx ).self_type,
object_owner => a_rows( a_idx ).object_owner, object_name => lower( a_rows( a_idx ).object_name),
name => lower( a_rows( a_idx ).name), description => a_rows( a_idx ).description, path => a_rows( a_idx ).path,
rollback_type => a_rows( a_idx ).rollback_type, disabled_flag => a_rows( a_idx ).disabled_flag,
line_no => a_rows( a_idx ).line_no, parse_time => a_rows( a_idx ).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows( a_idx ).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
items => ut_suite_items(), tags => null
)
end;
- 660
when 'UT_TEST' then
- 660
l_result :=
ut_test(
self_type => a_rows(a_idx).self_type,
object_owner => a_rows(a_idx).object_owner, object_name => lower(a_rows(a_idx).object_name),
name => lower(a_rows(a_idx).name), description => a_rows(a_idx).description, path => a_rows(a_idx).path,
rollback_type => a_rows(a_idx).rollback_type, disabled_flag => a_rows(a_idx).disabled_flag,
line_no => a_rows(a_idx).line_no, parse_time => a_rows(a_idx).parse_time,
start_time => null, end_time => null, result => null, warnings => a_rows(a_idx).warnings,
results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
before_each_list => sort_by_seq_no(a_rows(a_idx).before_each_list), before_test_list => sort_by_seq_no(a_rows(a_idx).before_test_list),
item => a_rows(a_idx).item,
after_test_list => sort_by_seq_no(a_rows(a_idx).after_test_list), after_each_list => sort_by_seq_no(a_rows(a_idx).after_each_list),
all_expectations => ut_expectation_results(), failed_expectations => ut_expectation_results(),
parent_error_stack_trace => null, expected_error_codes => a_rows(a_idx).expected_error_codes,
tags => a_rows(a_idx).tags
);
end case;
- 1164
l_result.results_count.warnings_count := l_result.warnings.count;
- 1164
return l_result;
end;
procedure reconstruct_from_cache(
a_suites in out nocopy ut_suite_items,
a_suite_data_cursor sys_refcursor
) is
- 212
c_bulk_limit constant pls_integer := 1000;
l_items_at_level t_item_levels;
l_rows tt_cached_suites;
l_level pls_integer;
l_prev_level pls_integer;
l_idx integer;
begin
- 212
loop
- 212
fetch a_suite_data_cursor bulk collect into l_rows limit c_bulk_limit;
- 212
l_idx := l_rows.first;
- 1376
while l_idx is not null loop
- 1164
l_level := length(l_rows(l_idx).path) - length( replace(l_rows(l_idx).path, '.') ) + 1;
- 1164
if l_level > 1 then
- 935
if not l_items_at_level.exists(l_level) then
- 399
l_items_at_level(l_level) := ut_suite_items();
end if;
- 935
l_items_at_level(l_level).extend;
- 935
pragma inline(get_logical_suite, 'YES');
- 935
l_items_at_level(l_level)(l_items_at_level(l_level).last) := get_logical_suite(l_rows, l_idx, l_level,l_prev_level, l_items_at_level );
else
- 229
a_suites.extend;
- 229
pragma inline(get_logical_suite, 'YES');
- 229
a_suites(a_suites.last) := get_logical_suite(l_rows, l_idx, l_level,l_prev_level, l_items_at_level );
end if;
- 1164
if l_prev_level > l_level then
- 477
l_items_at_level(l_prev_level).delete;
end if;
- 1164
l_prev_level := l_level;
- 1164
l_idx := l_rows.next(l_idx);
end loop;
- 212
exit when a_suite_data_cursor%NOTFOUND;
end loop;
- 212
reverse_list_order( a_suites );
- 452
for i in 1 .. a_suites.count loop
- 240
a_suites( i ).set_rollback_type( a_suites( i ).get_rollback_type );
end loop;
- 212
close a_suite_data_cursor;
end reconstruct_from_cache;
function get_cached_suite_data(
a_object_owner varchar2,
a_path varchar2 := null,
a_object_name varchar2 := null,
a_procedure_name varchar2 := null,
a_skip_all_objects boolean := false,
a_random_seed positive,
a_tags ut_varchar2_rows := null
) return t_cached_suites_cursor is
l_unfiltered_rows ut_suite_cache_rows;
l_result t_cached_suites_cursor;
begin
- 212
l_unfiltered_rows := ut_suite_cache_manager.get_cached_suite_rows(
a_object_owner,
a_path,
a_object_name,
a_procedure_name,
a_random_seed,
a_tags
);
- 212
if a_skip_all_objects then
- 212
open l_result for
- 1
select c.* from table(l_unfiltered_rows) c;
else
open l_result for
select c.* from table(l_unfiltered_rows) c
where exists
( select 1
from all_objects a
where a.object_name = c.object_name
and a.owner = c.object_owner
and a.object_type = 'PACKAGE'
);
end if;
- 212
return l_result;
end;
function can_skip_all_objects_scan(
a_owner_name varchar2
) return boolean is
begin
- 474
return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc() or ut_trigger_check.is_alive();
end;
procedure build_and_cache_suites(
a_owner_name varchar2,
a_annotated_objects sys_refcursor
) is
l_annotated_objects ut_annotated_objects;
l_suite_items ut_suite_items;
- 356
l_bad_suitepath_obj ut_varchar2_list := ut_varchar2_list();
ex_string_too_small exception;
pragma exception_init (ex_string_too_small,-06502);
begin
- 356
ut_event_manager.trigger_event('build_and_cache_suites - start');
- 366
loop
- 366
fetch a_annotated_objects bulk collect into l_annotated_objects limit 10;
- 640
for i in 1 .. l_annotated_objects.count loop
begin
- 274
ut_suite_builder.create_suite_item_list( l_annotated_objects( i ), l_suite_items );
exception
- 4
when ex_string_too_small then
- 2
ut_utils.append_to_list(l_bad_suitepath_obj,a_owner_name||'.'||l_annotated_objects( i ).object_name);
end;
- 274
ut_suite_cache_manager.save_object_cache(
a_owner_name,
l_annotated_objects( i ).object_name,
l_annotated_objects( i ).parse_time,
l_suite_items
);
end loop;
- 366
exit when a_annotated_objects%notfound;
end loop;
- 356
close a_annotated_objects;
--Check for any invalid suitepath objects
- 356
if l_bad_suitepath_obj.count > 0 then
- 1
raise_application_error(
ut_utils.gc_value_too_large,
ut_utils.to_string(gc_suitpath_error_message||ut_utils.table_to_clob(l_bad_suitepath_obj,','))
);
end if;
- 355
ut_event_manager.trigger_event('build_and_cache_suites - end');
end;
procedure refresh_cache(
a_owner_name varchar2
) is
l_annotations_cursor sys_refcursor;
l_suite_cache_time timestamp;
begin
- 302
ut_event_manager.trigger_event('refresh_cache - start');
- 302
l_suite_cache_time := ut_suite_cache_manager.get_schema_parse_time(a_owner_name);
- 302
l_annotations_cursor := ut_annotation_manager.get_annotated_objects(
a_owner_name, 'PACKAGE', l_suite_cache_time
);
- 302
build_and_cache_suites(a_owner_name, l_annotations_cursor);
- 301
if can_skip_all_objects_scan(a_owner_name) or ut_metadata.is_object_visible( 'dba_objects') then
- 301
ut_suite_cache_manager.remove_missing_objs_from_cache( a_owner_name );
end if;
- 301
ut_event_manager.trigger_event('refresh_cache - end');
end;
procedure add_suites_for_path(
a_owner_name varchar2,
a_path varchar2 := null,
a_object_name varchar2 := null,
a_procedure_name varchar2 := null,
a_suites in out nocopy ut_suite_items,
a_random_seed positive,
a_tags ut_varchar2_rows := null
) is
begin
- 158
refresh_cache(a_owner_name);
- 158
reconstruct_from_cache(
a_suites,
get_cached_suite_data(
a_owner_name,
a_path,
a_object_name,
a_procedure_name,
can_skip_all_objects_scan(a_owner_name),
a_random_seed,
a_tags
)
);
end;
-----------------------------------------------
-----------------------------------------------
------------- Public definitions -------------
function build_suites_from_annotations(
a_owner_name varchar2,
a_annotated_objects sys_refcursor,
a_path varchar2 := null,
a_object_name varchar2 := null,
a_procedure_name varchar2 := null,
a_skip_all_objects boolean := false
) return ut_suite_items is
- 54
l_suites ut_suite_items := ut_suite_items();
begin
- 54
build_and_cache_suites(a_owner_name, a_annotated_objects);
- 54
reconstruct_from_cache(
l_suites,
get_cached_suite_data(
a_owner_name,
a_path,
a_object_name,
a_procedure_name,
a_skip_all_objects,
null,
null
)
);
- 54
return l_suites;
end;
function get_schema_ut_packages(a_schema_names ut_varchar2_rows) return ut_object_names is
begin
- 246
for i in 1 .. a_schema_names.count loop
- 129
refresh_cache(a_schema_names(i));
end loop;
- 117
return ut_suite_cache_manager.get_cached_packages( a_schema_names );
end;
function get_schema_names(a_paths ut_varchar2_list) return ut_varchar2_rows is
l_paths ut_varchar2_list;
begin
- 115
l_paths := a_paths;
- 115
return resolve_schema_names(l_paths);
end;
function configure_execution_by_path(a_paths ut_varchar2_list, a_random_seed positive := null) return ut_suite_items is
- 32
l_suites ut_suite_items := ut_suite_items();
begin
- 32
configure_execution_by_path(a_paths, l_suites );
- 30
return l_suites;
end;
procedure configure_execution_by_path(
a_paths ut_varchar2_list,
a_suites out nocopy ut_suite_items,
a_random_seed positive := null,
a_tags ut_varchar2_rows := ut_varchar2_rows()
) is
- 148
l_paths ut_varchar2_list := a_paths;
l_path_items t_path_items;
l_path_item t_path_item;
l_schema varchar2(4000);
- 148
l_suites_count pls_integer := 0;
l_index varchar2(4000 char);
l_schema_paths t_schema_paths;
begin
- 148
ut_event_manager.trigger_event('configure_execution_by_path - start');
- 148
a_suites := ut_suite_items();
--resolve schema names from paths and group paths by schema name
- 148
resolve_schema_names(l_paths);
- 147
l_schema_paths := group_paths_by_schema(l_paths);
- 147
l_schema := l_schema_paths.first;
- 292
while l_schema is not null loop
- 147
l_path_items := l_schema_paths(l_schema);
- 303
for i in 1 .. l_path_items.count loop
- 158
l_path_item := l_path_items(i);
- 158
add_suites_for_path(
upper(l_schema),
l_path_item.suite_path,
l_path_item.object_name,
l_path_item.procedure_name,
a_suites,
a_random_seed,
a_tags
);
- 158
if a_suites.count = l_suites_count then
- 3
if l_path_item.suite_path is not null then
raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for path '||l_schema||':'||l_path_item.suite_path|| '.');
- 3
elsif l_path_item.procedure_name is not null then
raise_application_error(ut_utils.gc_suite_package_not_found,'Suite test '||l_schema||'.'||l_path_item.object_name|| '.'||l_path_item.procedure_name||' does not exist');
- 3
elsif l_path_item.object_name is not null then
- 2
raise_application_error(ut_utils.gc_suite_package_not_found,'Suite package '||l_schema||'.'||l_path_item.object_name|| ' does not exist');
end if;
end if;
- 156
l_index := a_suites.first;
- 156
l_suites_count := a_suites.count;
end loop;
- 145
l_schema := l_schema_paths.next(l_schema);
end loop;
--propagate rollback type to suite items after organizing suites into hierarchy
- 320
for i in 1 .. a_suites.count loop
- 175
a_suites(i).set_rollback_type( a_suites(i).get_rollback_type() );
end loop;
- 145
ut_event_manager.trigger_event('configure_execution_by_path - start');
end configure_execution_by_path;
function get_suites_info(
a_owner_name varchar2,
a_package_name varchar2 := null
) return sys_refcursor is
l_result sys_refcursor;
l_all_suite_info ut_suite_items_info;
- 3
l_owner_name varchar2(250) := ut_utils.qualified_sql_name(a_owner_name);
- 3
l_package_name varchar2(250) := ut_utils.qualified_sql_name(a_package_name);
begin
- 3
refresh_cache(l_owner_name);
- 3
l_all_suite_info := ut_suite_cache_manager.get_cached_suite_info( l_owner_name, l_package_name );
- 3
if can_skip_all_objects_scan( l_owner_name ) then
- 3
open l_result for
- 1
select value(c)
from table(l_all_suite_info) c
order by c.object_owner, c.object_name, c.item_line_no;
else
open l_result for
select value(c)
from table(l_all_suite_info) c
where exists
( select 1
from all_objects a
where a.object_name = c.object_name
and a.owner = c.object_owner
and a.object_type = 'PACKAGE'
)
order by c.object_owner, c.object_name, c.item_line_no;
end if;
- 3
return l_result;
end;
function suite_item_exists(
a_owner_name varchar2,
a_package_name varchar2 := null,
a_procedure_name varchar2 := null
) return boolean is
- 12
l_count integer := 1;
l_item_exists boolean;
- 12
l_owner_name varchar2(250) := upper(a_owner_name);
- 12
l_package_name varchar2(250) := upper(a_package_name);
- 12
l_procedure_name varchar2(250) := upper(a_procedure_name);
begin
- 12
refresh_cache(l_owner_name);
- 12
l_item_exists := ut_suite_cache_manager.suite_item_exists( l_owner_name, l_package_name, l_procedure_name );
- 12
if not can_skip_all_objects_scan( l_owner_name ) then
select count(1)
into l_count
from dual c
where exists
( select 1
from all_objects a
where a.object_name = l_package_name
and a.owner = l_owner_name
and a.object_type = 'PACKAGE'
);
end if;
- 12
return l_count > 0 and l_item_exists;
end;
end ut_suite_manager;
UT3.UT_UTILS
94.29 % lines covered
350 relevant lines. 330 lines covered (including 4 lines partially covered ) and 20 lines missed
package body ut_utils is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
/**
* Constants regex used to validate XML name
*/
- 1
gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]';
- 1
gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]';
- 1
gc_full_valid_xml_name constant varchar2(50) := '^([_a-zA-Z])([_a-zA-Z0-9\.-])*$';
function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is
begin
- 1516
return case when a_quote_char is not null then a_quote_char||a_value||a_quote_char else a_value end;
end;
function test_result_to_char(a_test_result integer) return varchar2 as
l_result varchar2(20);
begin
- 21
if a_test_result = gc_success then
- 5
l_result := gc_success_char;
- 16
elsif a_test_result = gc_failure then
- 10
l_result := gc_failure_char;
- 6
elsif a_test_result = gc_error then
- 2
l_result := gc_error_char;
- 4
elsif a_test_result = gc_disabled then
- 2
l_result := gc_disabled_char;
else
- 2
l_result := 'Unknown(' || coalesce(to_char(a_test_result),'NULL') || ')';
end if ;
- 21
return l_result;
end test_result_to_char;
function to_test_result(a_test boolean) return integer is
l_result integer;
begin
- 1306
if a_test then
- 621
l_result := gc_success;
else
- 685
l_result := gc_failure;
end if;
- 1306
return l_result;
end;
function gen_savepoint_name return varchar2 is
begin
- 321
return 's'||trim(to_char(ut_savepoint_seq.nextval,'0000000000000000000000000000'));
end;
procedure debug_log(a_message varchar2) is
begin
$if $$ut_trace $then
dbms_output.put_line(a_message);
$else
- 5779
null;
$end
end;
procedure debug_log(a_message clob) is
l_varchars ut_varchar2_list;
begin
$if $$ut_trace $then
l_varchars := clob_to_table(a_message);
for i in 1..l_varchars.count loop
dbms_output.put_line(l_varchars(i));
end loop;
$else
- 429
null;
$end
end;
function to_string(
a_value varchar2,
a_quote_char varchar2 := '''',
a_max_output_len in number := gc_max_output_string_length
) return varchar2 is
l_result varchar2(32767);
- 1189
c_length constant integer := coalesce( length( a_value ), 0 );
- 1189
c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 );
- 1189
c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len;
begin
- 1189
if c_length = 0 then
- 18
l_result := gc_null_string;
- 1171
elsif c_length <= c_max_input_string_length then
- 1166
l_result := surround_with(a_value, a_quote_char);
else
- 5
l_result := surround_with(substr(a_value, 1, c_overflow_substr_len ), a_quote_char) || gc_more_data_string;
end if ;
- 1189
return l_result;
end;
function to_string(
a_value clob,
a_quote_char varchar2 := '''',
a_max_output_len in number := gc_max_output_string_length
) return varchar2 is
l_result varchar2(32767);
- 355
c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0);
- 355
c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 );
- 355
c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len;
begin
- 355
if a_value is null then
- 16
l_result := gc_null_string;
- 339
elsif c_length = 0 then
- 6
l_result := gc_empty_string;
- 333
elsif c_length <= c_max_input_string_length then
- 315
l_result := surround_with(a_value,a_quote_char);
else
- 18
l_result := surround_with(dbms_lob.substr(a_value, c_overflow_substr_len), a_quote_char) || gc_more_data_string;
end if;
- 355
return l_result;
end;
function to_string(
a_value blob,
a_quote_char varchar2 := '''',
a_max_output_len in number := gc_max_output_string_length
) return varchar2 is
l_result varchar2(32767);
- 34
c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0);
- 34
c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 );
- 34
c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len;
begin
- 34
if a_value is null then
- 14
l_result := gc_null_string;
- 20
elsif c_length = 0 then
- 6
l_result := gc_empty_string;
- 14
elsif c_length <= c_max_input_string_length then
- 12
l_result := surround_with(rawtohex(a_value),a_quote_char);
else
- 2
l_result := to_string( rawtohex(dbms_lob.substr(a_value, c_overflow_substr_len)) );
end if ;
- 34
return l_result;
end;
function to_string(a_value boolean) return varchar2 is
begin
- 86
return case a_value when true then 'TRUE' when false then 'FALSE' else gc_null_string end;
end;
function to_string(a_value number) return varchar2 is
begin
- 493
return coalesce(to_char(a_value,gc_number_format), gc_null_string);
end;
function to_string(a_value date) return varchar2 is
begin
- 80
return coalesce(to_char(a_value,gc_date_format), gc_null_string);
end;
function to_string(a_value timestamp_unconstrained) return varchar2 is
begin
- 479
return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string);
end;
function to_string(a_value timestamp_tz_unconstrained) return varchar2 is
begin
- 748
return coalesce(to_char(a_value,gc_timestamp_tz_format), gc_null_string);
end;
function to_string(a_value timestamp_ltz_unconstrained) return varchar2 is
begin
- 86
return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string);
end;
function to_string(a_value yminterval_unconstrained) return varchar2 IS
begin
- 72
return coalesce(to_char(a_value), gc_null_string);
end;
function to_string(a_value dsinterval_unconstrained) return varchar2 IS
begin
- 72
return coalesce(to_char(a_value), gc_null_string);
end;
function boolean_to_int(a_value boolean) return integer is
begin
- 9853
return case a_value when true then 1 when false then 0 end;
end;
function int_to_boolean(a_value integer) return boolean is
begin
- 4412
return case a_value when 1 then true when 0 then false end;
end;
function string_to_table(a_string varchar2, a_delimiter varchar2:= chr(10), a_skip_leading_delimiter varchar2 := 'N') return ut_varchar2_list is
- 20813
l_offset integer := 1;
l_delimiter_position integer;
- 20813
l_skip_leading_delimiter boolean := coalesce(a_skip_leading_delimiter = 'Y',false);
- 20813
l_result ut_varchar2_list := ut_varchar2_list();
begin
- 20813
if a_string is null then
return l_result;
end if;
- 20813
if a_delimiter is null then
- 2
return ut_varchar2_list(a_string);
end if;
- 27082
loop
- 27082
l_delimiter_position := instr(a_string, a_delimiter, l_offset);
- 27082
if not (l_delimiter_position = 1 and l_skip_leading_delimiter) then
- 27081
l_result.extend;
- 27081
if l_delimiter_position > 0 then
- 6270
l_result(l_result.last) := substr(a_string, l_offset, l_delimiter_position - l_offset);
else
- 20811
l_result(l_result.last) := substr(a_string, l_offset);
end if;
end if;
- 27082
exit when l_delimiter_position = 0;
- 6271
l_offset := l_delimiter_position + 1;
end loop;
- 20811
return l_result;
end;
function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list is
- 18302
l_offset integer := 1;
- 18302
l_length integer := dbms_lob.getlength(a_clob);
l_amount integer;
l_buffer varchar2(32767);
l_last_line varchar2(32767);
l_string_results ut_varchar2_list;
- 18302
l_results ut_varchar2_list := ut_varchar2_list();
l_has_last_line boolean;
- 18302
l_skip_leading_delimiter varchar2(1) := 'N';
begin
- 36615
while l_offset <= l_length loop
- 18313
l_amount := a_max_amount - coalesce( length(l_last_line), 0 );
-- dbms_lob.read(a_clob, l_amount, l_offset, l_buffer);
- 18313
l_buffer := substr(a_clob, l_offset, l_amount);
- 18313
l_amount := length(l_buffer);
- 18313
l_offset := l_offset + l_amount;
- 18313
l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter );
- 42495
for i in 1 .. l_string_results.count loop
--if a split of lines was not done or not at the last line
- 24182
if l_string_results.count = 1 or i < l_string_results.count then
- 23630
l_results.extend;
- 23630
l_results(l_results.last) := l_string_results(i);
end if;
end loop;
--check if we need to append the last line to the next element
- 18313
if l_string_results.count = 1 then
- 17761
l_has_last_line := false;
- 17761
l_last_line := null;
- 552
elsif l_string_results.count > 1 then
- 552
l_has_last_line := true;
- 552
l_last_line := l_string_results(l_string_results.count);
end if;
- 18313
l_skip_leading_delimiter := 'Y';
end loop;
- 18302
if l_has_last_line then
- 545
l_results.extend;
- 545
l_results(l_results.last) := l_last_line;
end if;
- 18302
return l_results;
end;
function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob is
l_result clob;
- 1018
l_table_rows integer := coalesce(cardinality(a_text_table),0);
begin
- 22014
for i in 1 .. l_table_rows loop
- 20996
if i < l_table_rows then
- 20013
append_to_clob(l_result, a_text_table(i)||a_delimiter);
else
- 983
append_to_clob(l_result, a_text_table(i));
end if;
end loop;
- 1018
return l_result;
end;
function table_to_clob(a_text_table ut_varchar2_rows, a_delimiter varchar2:= chr(10)) return clob is
l_result clob;
- 18
l_table_rows integer := coalesce(cardinality(a_text_table),0);
begin
- 28
for i in 1 .. l_table_rows loop
- 10
if i < l_table_rows then
- 3
append_to_clob(l_result, a_text_table(i)||a_delimiter);
else
- 7
append_to_clob(l_result, a_text_table(i));
end if;
end loop;
- 18
return l_result;
end;
function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob is
l_result clob;
- 16
l_table_rows integer := coalesce(cardinality(a_integer_table),0);
begin
- 39
for i in 1 .. l_table_rows loop
- 23
if i < l_table_rows then
- 7
append_to_clob(l_result, a_integer_table(i)||a_delimiter);
else
- 16
append_to_clob(l_result, a_integer_table(i));
end if;
end loop;
- 16
return l_result;
end;
function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number is
begin
- 424
return
extract(day from(a_end_time - a_start_time)) * 24 * 60 * 60 +
extract(hour from(a_end_time - a_start_time)) * 60 * 60 +
extract(minute from(a_end_time - a_start_time)) * 60 +
extract(second from(a_end_time - a_start_time));
end;
function indent_lines(a_text varchar2, a_indent_size integer := 4, a_include_first_line boolean := false) return varchar2 is
begin
- 82
if a_include_first_line then
- 82
return rtrim(lpad( ' ', a_indent_size ) || replace( a_text, chr(10), chr(10) || lpad( ' ', a_indent_size ) ));
else
return rtrim(replace( a_text, chr(10), chr(10) || lpad( ' ', a_indent_size ) ));
end if;
end;
function get_utplsql_objects_list return ut_object_names is
l_result ut_object_names;
begin
select distinct ut_object_name(sys_context('userenv','current_user'), o.object_name)
bulk collect into l_result
from user_objects o
where o.object_name = 'UT' or object_name like 'UT\_%' escape '\'
and o.object_type <> 'SYNONYM';
return l_result;
end;
procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2) is
begin
- 1028
if a_item is not null then
- 169
if a_list is null then
- 6
a_list := ut_varchar2_list();
end if;
- 169
a_list.extend;
- 169
a_list(a_list.last) := a_item;
end if;
end append_to_list;
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows) is
begin
- 570
if a_items is not null then
- 570
if a_list is null then
- 17
a_list := ut_varchar2_rows();
end if;
- 13651
for i in 1 .. a_items.count loop
- 13081
a_list.extend;
- 13081
a_list(a_list.last) := a_items(i);
end loop;
end if;
end;
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob) is
begin
- 479
append_to_list(
a_list,
convert_collection(
clob_to_table( a_item, ut_utils.gc_max_storage_varchar2_len )
)
);
end;
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2) is
begin
- 13264
if a_item is not null then
- 13264
if a_list is null then
- 30
a_list := ut_varchar2_rows();
end if;
- 13264
if length(a_item) > gc_max_storage_varchar2_len then
append_to_list(
a_list,
ut_utils.convert_collection(
ut_utils.clob_to_table( a_item, gc_max_storage_varchar2_len )
)
);
else
- 13264
a_list.extend;
- 13264
a_list(a_list.last) := a_item;
end if;
end if;
end append_to_list;
procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2:= chr(10)) is
begin
- 127
if a_clob_table is not null and cardinality(a_clob_table) > 0 then
- 104
if a_src_clob is null then
dbms_lob.createtemporary(a_src_clob, true);
end if;
- 433
for i in 1 .. a_clob_table.count loop
- 329
dbms_lob.append(a_src_clob,a_clob_table(i));
- 329
if i < a_clob_table.count then
- 225
append_to_clob(a_src_clob,a_delimiter);
end if;
end loop;
end if;
end;
procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob) is
begin
- 1421
if a_new_data is not null and dbms_lob.getlength(a_new_data) > 0 then
- 1300
if a_src_clob is null then
- 1018
dbms_lob.createtemporary(a_src_clob, true);
end if;
- 1300
dbms_lob.append(a_src_clob, a_new_data);
end if;
end;
procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data varchar2) is
begin
- 40854
if a_new_data is not null then
- 40852
if a_src_clob is null then
- 1673
dbms_lob.createtemporary(a_src_clob, true);
end if;
- 40852
dbms_lob.writeappend(a_src_clob, dbms_lob.getlength(a_new_data), a_new_data);
end if;
end;
function convert_collection(a_collection ut_varchar2_list) return ut_varchar2_rows is
l_result ut_varchar2_rows;
begin
- 1064
if a_collection is not null then
- 1064
l_result := ut_varchar2_rows();
- 5588
for i in 1 .. a_collection.count loop
- 4524
l_result.extend();
- 4524
l_result(i) := substr(a_collection(i),1,gc_max_storage_varchar2_len);
end loop;
end if;
- 1064
return l_result;
end;
function to_xpath(a_list varchar2, a_ancestors varchar2 := '/*/') return varchar2 is
l_xpath varchar2(32767) := a_list;
begin
l_xpath := to_xpath( clob_to_table(a_clob=>a_list, a_delimiter=>','), a_ancestors);
return l_xpath;
end;
function to_xpath(a_list ut_varchar2_list, a_ancestors varchar2 := '/*/') return varchar2 is
l_xpath varchar2(32767);
l_item varchar2(32767);
l_iter integer;
begin
- 165
if a_list is not null then
- 165
l_iter := a_list.first;
- 464
while l_iter is not null loop
- 299
l_item := trim(a_list(l_iter));
- 299
if l_item is not null then
- 299
if l_item like '%,%' then
l_xpath := l_xpath || to_xpath( l_item, a_ancestors ) || '|';
- 299
elsif l_item like '/%' then
l_xpath := l_xpath || l_item || '|';
else
- 299
l_xpath := l_xpath || a_ancestors || l_item || '|';
end if;
end if;
- 299
l_iter := a_list.next(l_iter);
end loop;
- 165
l_xpath := rtrim(l_xpath,',|');
end if;
- 165
return l_xpath;
end;
procedure cleanup_session_temp_tables is
begin
- 114
execute immediate 'truncate table dbmspcc_blocks';
- 114
execute immediate 'truncate table dbmspcc_units';
- 114
execute immediate 'truncate table dbmspcc_runs';
end;
function to_version(a_version_no varchar2) return t_version is
l_result t_version;
- 32
c_version_part_regex constant varchar2(20) := '[0-9]+';
begin
- 32
if regexp_like(a_version_no,'v?([0-9]+(\.|$)){1,4}') then
- 30
l_result.major := regexp_substr(a_version_no, c_version_part_regex, 1, 1);
- 30
l_result.minor := regexp_substr(a_version_no, c_version_part_regex, 1, 2);
- 30
l_result.bugfix := regexp_substr(a_version_no, c_version_part_regex, 1, 3);
- 30
l_result.build := regexp_substr(a_version_no, c_version_part_regex, 1, 4);
else
- 2
raise_application_error(gc_invalid_version_no, 'Version string "'||a_version_no||'" is not a valid version');
end if;
- 30
return l_result;
end;
procedure save_dbms_output_to_cache is
l_status number;
l_line varchar2(32767);
- 116
l_offset integer := 0;
- 116
l_lines ut_varchar2_rows := ut_varchar2_rows();
- 116
c_lines_limit constant integer := 100;
pragma autonomous_transaction;
procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is
begin
- 119
if a_lines is not empty then
- 4
insert into ut_dbms_output_cache (seq_no,text)
select rownum+a_offset, column_value
from table(a_lines);
end if;
end;
begin
- 419
loop
- 419
dbms_output.get_line(line => l_line, status => l_status);
- 419
exit when l_status = 1;
- 303
l_lines := l_lines multiset union all ut_utils.convert_collection(ut_utils.clob_to_table(l_line||chr(7),4000));
- 303
if l_lines.count > c_lines_limit then
- 3
flush_lines(l_lines, l_offset);
- 3
l_offset := l_offset + l_lines.count;
- 3
l_lines.delete;
end if;
end loop;
- 116
flush_lines(l_lines, l_offset);
- 116
commit;
end;
procedure read_cache_to_dbms_output is
l_lines_data sys_refcursor;
l_lines ut_varchar2_rows;
- 116
c_lines_limit constant integer := 10000;
pragma autonomous_transaction;
begin
- 116
open l_lines_data for select text from ut_dbms_output_cache order by seq_no;
- 116
loop
- 116
fetch l_lines_data bulk collect into l_lines limit c_lines_limit;
- 421
for i in 1 .. l_lines.count loop
- 305
if substr(l_lines(i),-1) = chr(7) then
- 303
dbms_output.put_line(rtrim(l_lines(i),chr(7)));
else
- 2
dbms_output.put(l_lines(i));
end if;
end loop;
- 116
exit when l_lines_data%notfound;
end loop;
- 116
execute immediate 'truncate table ut_dbms_output_cache';
- 116
commit;
end;
function ut_owner return varchar2 is
begin
- 1428
return sys_context('userenv','current_schema');
end;
function scale_cardinality(a_cardinality natural) return natural is
begin
- 396
return case when a_cardinality > 0 then trunc(power(10,(floor(log(10,a_cardinality))+1))/3) else 1 end;
end;
function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2 is
begin
- 23
return 'The syntax: "'||a_old_syntax||'" is deprecated.' ||chr(10)||
'Please use the new syntax: "'||a_new_syntax||'".' ||chr(10)||
'The deprecated syntax will not be supported in future releases.';
end;
function to_xml_number_format(a_value number) return varchar2 is
begin
- 90
return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. ''');
end;
function get_xml_header(a_encoding varchar2) return varchar2 is
begin
- 38
return
'<?xml version="1.0"'
- 1
||case
- 1
when a_encoding is not null
then ' encoding="'||upper(a_encoding)||'"'
end
||'?>';
end;
function trim_list_elements(a_list ut_varchar2_list, a_regexp_to_trim varchar2 default '[:space:]') return ut_varchar2_list is
l_trimmed_list ut_varchar2_list;
l_index integer;
begin
- 800
if a_list is not null then
- 799
l_trimmed_list := ut_varchar2_list();
- 799
l_index := a_list.first;
- 1734
while (l_index is not null) loop
- 935
l_trimmed_list.extend;
- 935
l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_regexp_to_trim||']*)|(['||a_regexp_to_trim||']*$)');
- 935
l_index := a_list.next(l_index);
end loop;
end if;
- 800
return l_trimmed_list;
end;
function filter_list(a_list in ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list is
l_filtered_list ut_varchar2_list;
l_index integer;
begin
- 770
if a_list is not null then
- 769
l_filtered_list := ut_varchar2_list();
- 769
l_index := a_list.first;
- 1651
while (l_index is not null) loop
- 882
if regexp_like(a_list(l_index), a_regexp_filter) then
- 875
l_filtered_list.extend;
- 875
l_filtered_list(l_filtered_list.count) := a_list(l_index);
end if;
- 882
l_index := a_list.next(l_index);
end loop;
end if;
- 770
return l_filtered_list;
end;
function xmlgen_escaped_string(a_string in varchar2) return varchar2 is
l_result varchar2(4000) := a_string;
l_sql varchar2(32767) := q'!select q'[!'||a_string||q'!]' as "!'||a_string||'" from dual';
begin
if a_string is not null then
select extract(dbms_xmlgen.getxmltype(l_sql),'/*/*/*').getRootElement()
into l_result
from dual;
end if;
return l_result;
end;
function replace_multiline_comments(a_source clob) return clob is
l_result clob;
- 558
l_ml_comment_start binary_integer := 1;
- 558
l_comment_start binary_integer := 1;
- 558
l_text_start binary_integer := 1;
- 558
l_escaped_text_start binary_integer := 1;
l_escaped_text_end_char varchar2(1 char);
- 558
l_end binary_integer := 1;
l_ml_comment clob;
l_newlines_count binary_integer;
- 558
l_offset binary_integer := 1;
- 558
l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0);
begin
- 558
l_ml_comment_start := instr(a_source,'/*');
- 558
l_comment_start := instr(a_source,'--');
- 558
l_text_start := instr(a_source,'''');
- 558
l_escaped_text_start := instr(a_source,q'[q']');
- 739
while l_offset > 0 and l_ml_comment_start > 0 loop
- 181
if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0)
- 1
and (l_ml_comment_start < l_text_start or l_text_start = 0)and (l_ml_comment_start < l_escaped_text_start or l_escaped_text_start = 0)
then
- 13
l_end := instr(a_source,'*/',l_ml_comment_start+2);
- 13
append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset));
- 13
if l_end > 0 then
- 13
l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start);
- 13
l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') );
- 13
if l_newlines_count > 0 then
- 6
append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) );
end if;
- 13
l_end := l_end + 2;
end if;
else
- 168
if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0)
- 1
and (l_comment_start < l_text_start or l_text_start = 0) and (l_comment_start < l_escaped_text_start or l_escaped_text_start = 0)
then
- 163
l_end := instr(a_source,chr(10),l_comment_start+2);
- 163
if l_end > 0 then
- 163
l_end := l_end + 1;
end if;
- 2/3 5
elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0)
- 1
and (l_text_start < l_comment_start or l_comment_start = 0) and (l_text_start < l_escaped_text_start or l_escaped_text_start = 0)
then
- 3
l_end := instr(a_source,q'[']',l_text_start+1);
--skip double quotes while searching for end of quoted text
- 3
while l_end > 0 and l_end = instr(a_source,q'['']',l_text_start+1) loop
l_end := instr(a_source,q'[']',l_end+1);
end loop;
- 3
if l_end > 0 then
- 3
l_end := l_end + 1;
end if;
- 2/3 2
elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0)
- 3/4 1
and (l_escaped_text_start < l_comment_start or l_comment_start = 0) and (l_escaped_text_start < l_text_start or l_text_start = 0)
then
--translate char "[" from the start of quoted text "q'[someting]'" into "]"
- 2
l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>');
- 2
l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 );
- 2
if l_end > 0 then
- 2
l_end := l_end + 2;
end if;
end if;
- 168
if l_end = 0 then
append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset));
else
- 168
append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset));
end if;
end if;
- 181
l_offset := l_end;
- 181
if l_offset >= l_ml_comment_start then
- 19
l_ml_comment_start := instr(a_source,'/*',l_offset);
end if;
- 181
if l_offset >= l_comment_start then
- 167
l_comment_start := instr(a_source,'--',l_offset);
end if;
- 181
if l_offset >= l_text_start then
- 166
l_text_start := instr(a_source,'''',l_offset);
end if;
- 181
if l_offset >= l_escaped_text_start then
- 171
l_escaped_text_start := instr(a_source,q'[q']',l_offset);
end if;
end loop;
- 558
append_to_clob(l_result, substr(a_source, l_end));
- 558
return l_result;
end;
function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is
- 4
l_for_reporters ut_reporters_info := a_for_reporters;
l_results ut_reporters_info;
begin
- 4
if l_for_reporters is null then
- 1
l_for_reporters := ut_reporters_info(ut_reporter_info('UT_REPORTER_BASE','N','N','N'));
end if;
- 4
select /*+ cardinality(f 10) */
ut_reporter_info(
object_name => t.type_name,
is_output_reporter =>
case
when f.is_output_reporter = 'Y' or t.type_name = 'UT_OUTPUT_REPORTER_BASE'
then 'Y' else 'N'
end,
is_instantiable => case when t.instantiable = 'YES' then 'Y' else 'N' end,
is_final => case when t.final = 'YES' then 'Y' else 'N' end
)
bulk collect into l_results
from user_types t
join (select * from table(l_for_reporters) where is_final = 'N' ) f
on f.object_name = supertype_name;
- 4
return l_results;
end;
function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2 is
l_caller_stack_line varchar2(4000);
- 4
l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$';
begin
- 4
l_caller_stack_line := regexp_replace(srcstr => a_error_stack
,pattern => l_ora_search_pattern
,replacestr => null
,position => 1
,occurrence => 1
,modifier => 'm');
- 4
return l_caller_stack_line;
end;
/**
* Change string into unicode to match xmlgen format _00<unicode>_
* https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2
* secion v3.1.8.3169-develop
*/
function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is
begin
- 20
return '_x00'||rawtohex(utl_raw.cast_to_raw(a_character))||'_';
end;
/**
* Build valid XML column name as element names can contain letters, digits, hyphens, underscores, and periods
*/
function build_valid_xml_name(a_preprocessed_name varchar2) return varchar2 is
l_post_processed varchar2(4000);
begin
- 1/2 92
for i in (select regexp_substr( a_preprocessed_name ,'(.{1})', 1, level, null, 1 ) AS string_char,level level_no
from dual connect by level <= regexp_count(a_preprocessed_name, '(.{1})'))
loop
- 60
if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then
- 16
l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char);
- 44
elsif regexp_like(i.string_char,gc_invalid_xml_char) then
- 4
l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char);
else
- 40
l_post_processed := l_post_processed || i.string_char;
end if;
end loop;
- 16
return l_post_processed;
end;
function get_valid_xml_name(a_name varchar2) return varchar2 is
l_valid_name varchar2(4000);
begin
- 1226
if regexp_like(a_name,gc_full_valid_xml_name) then
- 1210
l_valid_name := a_name;
else
- 16
l_valid_name := build_valid_xml_name(a_name);
end if;
- 1226
return l_valid_name;
end;
function to_cdata(a_lines ut_varchar2_rows) return ut_varchar2_rows is
l_results ut_varchar2_rows;
begin
- 29
if a_lines is not empty then
- 29
ut_utils.append_to_list( l_results, gc_cdata_start_tag);
- 80
for i in 1 .. a_lines.count loop
- 51
ut_utils.append_to_list( l_results, replace( a_lines(i), gc_cdata_end_tag, gc_cdata_end_tag_wrap ) );
end loop;
- 29
ut_utils.append_to_list( l_results, gc_cdata_end_tag);
else
l_results := a_lines;
end if;
- 29
return l_results;
end;
function to_cdata(a_clob clob) return clob is
l_result clob;
begin
- 9
if a_clob is not null and a_clob != empty_clob() then
- 9
l_result := replace( a_clob, gc_cdata_end_tag, gc_cdata_end_tag_wrap );
else
l_result := a_clob;
end if;
- 9
return l_result;
end;
function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is
- 73
l_result ut_varchar2_list := ut_varchar2_list();
l_idx binary_integer;
begin
- 73
if a_prefix is not null then
- 65
l_idx := a_list.first;
- 69
while l_idx is not null loop
- 4
l_result.extend;
- 4
l_result(l_idx) := add_prefix(a_list(l_idx), a_prefix, a_connector);
- 4
l_idx := a_list.next(l_idx);
end loop;
end if;
- 73
return l_result;
end;
function add_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2 is
begin
- 4
return a_prefix||a_connector||trim(leading a_connector from a_item);
end;
function strip_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2 is
begin
- 380
return regexp_replace(a_item,a_prefix||a_connector);
end;
function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is
begin
- 390
return dbms_crypto.hash(a_data, a_hash_type);
end;
function get_hash(a_data clob, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is
begin
- 48
return dbms_crypto.hash(a_data, a_hash_type);
end;
function qualified_sql_name(a_name varchar2) return varchar2 is
begin
- 1580
return
- 1
case
- 1
when a_name is not null
then sys.dbms_assert.qualified_sql_name(a_name)
end;
end;
end ut_utils;
UT3.UT_COMPOUND_DATA_HELPER
99.09 % lines covered
220 relevant lines. 218 lines covered (including 1 lines partially covered ) and 2 lines missed
package body ut_compound_data_helper is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
g_diff_count integer;
type t_type_name_map is table of varchar2(128) index by binary_integer;
type t_types_no_length is table of varchar2(128) index by varchar2(128);
g_type_name_map t_type_name_map;
g_anytype_name_map t_type_name_map;
g_type_no_length_map t_types_no_length;
- 1
g_compare_sql_template varchar2(4000) :=
q'[
with exp as (
select
ucd.*,
{:duplicate_number:} dup_no
from (
select
ucd.item_data
,x.data_id data_id
,position + x.item_no item_no
{:columns:}
from ut_compound_data_tmp x,
xmltable('/ROWSET/ROW' passing x.item_data columns
item_data xmltype path '*'
,position for ordinality
{:xml_to_columns:} ) ucd
where data_id = :exp_guid
) ucd
)
, act as (
select
ucd.*,
{:duplicate_number:} dup_no
from (
select
ucd.item_data
,x.data_id data_id
,position + x.item_no item_no
{:columns:}
from ut_compound_data_tmp x,
xmltable('/ROWSET/ROW' passing x.item_data columns
item_data xmltype path '*'
,position for ordinality
{:xml_to_columns:} ) ucd
where data_id = :act_guid
) ucd
)
select
a.item_data as act_item_data,
a.data_id act_data_id,
e.item_data as exp_item_data,
e.data_id exp_data_id,
{:item_no:} as item_no,
nvl(e.dup_no,a.dup_no) dup_no
from act a {:join_type:} exp e on ( {:join_condition:} )
where {:where_condition:}]';
function get_columns_diff(
a_expected ut_cursor_column_tab,
a_actual ut_cursor_column_tab,
a_order_enforced boolean := false
) return tt_column_diffs is
l_results tt_column_diffs;
begin
- 158
execute immediate q'[with
expected_cols as (
select display_path exp_column_name,column_position exp_col_pos,
replace(column_type_name,'VARCHAR2','CHAR') exp_col_type_compare, column_type_name exp_col_type
from table(:a_expected)
where parent_name is null and hierarchy_level = 1 and column_name is not null
),
actual_cols as (
select display_path act_column_name,column_position act_col_pos,
replace(column_type_name,'VARCHAR2','CHAR') act_col_type_compare, column_type_name act_col_type
from table(:a_actual)
where parent_name is null and hierarchy_level = 1 and column_name is not null
),
joined_cols as (
select e.*,a.*]'
- 1
|| case when a_order_enforced then ',
row_number() over(partition by case when a.act_col_pos + e.exp_col_pos is not null then 1 end order by a.act_col_pos) a_pos_nn,
row_number() over(partition by case when a.act_col_pos + e.exp_col_pos is not null then 1 end order by e.exp_col_pos) e_pos_nn'
else
null
end ||q'[
from expected_cols e
full outer join actual_cols a
on e.exp_column_name = a.act_column_name
)
select case
when exp_col_pos is null and act_col_pos is not null then '+'
when exp_col_pos is not null and act_col_pos is null then '-'
when exp_col_type_compare != act_col_type_compare then 't'
else 'p'
end as diff_type,
exp_column_name, exp_col_type, exp_col_pos,
act_column_name, act_col_type, act_col_pos
from joined_cols
--column is unexpected (extra) or missing
where act_col_pos is null or exp_col_pos is null
--column type is not matching (except CHAR/VARCHAR2)
or act_col_type_compare != exp_col_type_compare]'
- 1
|| case when a_order_enforced then q'[
--column position is not matching (both when excluded extra/missing columns as well as when they are included)
or (a_pos_nn != e_pos_nn and exp_col_pos != act_col_pos)]'
else
null
end ||q'[
order by exp_col_pos, act_col_pos]'
bulk collect into l_results using a_expected, a_actual;
- 158
return l_results;
end;
function generate_not_equal_stmt(
a_data_info ut_cursor_column, a_pk_table ut_varchar2_list
) return varchar2
is
- 418
l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list());
l_index integer;
l_sql_stmt varchar2(32767);
- 418
l_exists boolean := false;
begin
- 418
l_index := l_pk_tab.first;
- 418
if l_pk_tab.count > 0 then
- 129
loop
- 129
if a_data_info.access_path = l_pk_tab(l_index) then
- 39
l_exists := true;
end if;
- 129
exit when l_index = l_pk_tab.count or (a_data_info.access_path = l_pk_tab(l_index));
- 11
l_index := a_pk_table.next(l_index);
end loop;
end if;
- 418
if not(l_exists) then
- 379
l_sql_stmt := ' (decode(a.'||a_data_info.transformed_name||','||' e.'||a_data_info.transformed_name||',1,0) = 0)';
end if;
- 418
return l_sql_stmt;
end;
function generate_join_by_stmt(
a_data_info ut_cursor_column, a_pk_table ut_varchar2_list
) return varchar2
is
- 418
l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list());
l_index integer;
l_sql_stmt varchar2(32767);
begin
- 418
if l_pk_tab.count <> 0 then
- 118
l_index:= l_pk_tab.first;
- 129
loop
- 129
if l_pk_tab(l_index) in (a_data_info.access_path, a_data_info.parent_name) then
--When then table is nested and join is on whole table
- 44
l_sql_stmt := l_sql_stmt ||' a.'||a_data_info.transformed_name||q'[ = ]'||' e.'||a_data_info.transformed_name;
end if;
- 129
exit when (a_data_info.access_path = l_pk_tab(l_index)) or l_index = l_pk_tab.count;
- 11
l_index := l_pk_tab.next(l_index);
end loop;
end if;
- 418
return l_sql_stmt;
end;
function generate_equal_sql(a_col_name in varchar2) return varchar2 is
begin
- 418
return ' decode(a.'||a_col_name||','||' e.'||a_col_name||',1,0) = 1 ';
end;
function generate_partition_stmt(
a_data_info ut_cursor_column, a_pk_table in ut_varchar2_list, a_alias varchar2 := 'ucd.'
) return varchar2
is
l_index integer;
l_sql_stmt varchar2(32767);
begin
- 418
if a_pk_table is not empty then
- 118
l_index:= a_pk_table.first;
- 129
loop
- 129
if a_pk_table(l_index) in (a_data_info.access_path, a_data_info.parent_name) then
--When then table is nested and join is on whole table
- 44
l_sql_stmt := l_sql_stmt ||a_alias||a_data_info.transformed_name;
end if;
- 129
exit when (a_data_info.access_path = a_pk_table(l_index)) or l_index = a_pk_table.count;
- 11
l_index := a_pk_table.next(l_index);
end loop;
else
- 300
l_sql_stmt := a_alias||a_data_info.transformed_name;
end if;
- 418
return l_sql_stmt;
end;
function generate_select_stmt(a_data_info ut_cursor_column, a_alias varchar2 := 'ucd.')
return varchar2
is
- 418
l_alias varchar2(10) := a_alias;
l_col_syntax varchar2(4000);
begin
- 418
if a_data_info.is_sql_diffable = 0 then
- 11
l_col_syntax := 'ut_utils.get_hash('||l_alias||a_data_info.transformed_name||'.getClobVal()) as '||a_data_info.transformed_name ;
- 407
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then
- 4
l_col_syntax := 'to_date('||l_alias||a_data_info.transformed_name||') as '|| a_data_info.transformed_name;
- 403
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP') then
- 5
l_col_syntax := 'to_timestamp('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_format||''') as '|| a_data_info.transformed_name;
- 398
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH TIME ZONE') then
- 1
l_col_syntax := 'to_timestamp_tz('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_tz_format||''') as '|| a_data_info.transformed_name;
- 397
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH LOCAL TIME ZONE') then
- 1
l_col_syntax := ' cast( to_timestamp_tz('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_tz_format||''') AS TIMESTAMP WITH LOCAL TIME ZONE) as '|| a_data_info.transformed_name;
else
- 396
l_col_syntax := l_alias||a_data_info.transformed_name||' as '|| a_data_info.transformed_name;
end if;
- 418
return l_col_syntax;
end;
function generate_xmltab_stmt(a_data_info ut_cursor_column) return varchar2 is
l_col_type varchar2(4000);
begin
- 418
if a_data_info.is_sql_diffable = 0 then
- 11
l_col_type := 'XMLTYPE';
- 407
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE',
- 1
'TIMESTAMP WITH LOCAL TIME ZONE') then
- 11
l_col_type := 'VARCHAR2(50)';
- 396
elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then
- 9
l_col_type := a_data_info.column_type;
- 387
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then
- 211
l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')';
- 176
elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('NUMBER') then
--We cannot use a precision and scale as dbms_sql.describe_columns3 return precision 0 for dual table
-- there is also no need for that as we not process data but only read and compare as they are stored
- 169
l_col_type := a_data_info.column_type;
else
- 7
l_col_type := a_data_info.column_type
- 1
||case when a_data_info.column_len is not null
then '('||a_data_info.column_len||')'
else null
end;
end if;
- 418
return a_data_info.transformed_name||' '||l_col_type||q'[ PATH ']'||a_data_info.access_path||q'[']';
end;
procedure gen_sql_pieces_out_of_cursor(
a_data_info ut_cursor_column_tab,
a_pk_table ut_varchar2_list,
a_unordered boolean,
a_xml_stmt out nocopy clob,
a_select_stmt out nocopy clob,
a_partition_stmt out nocopy clob,
a_join_by_stmt out nocopy clob,
a_not_equal_stmt out nocopy clob
) is
l_partition_tmp clob;
- 173
l_xmltab_list ut_varchar2_list := ut_varchar2_list();
- 173
l_select_list ut_varchar2_list := ut_varchar2_list();
- 173
l_partition_list ut_varchar2_list := ut_varchar2_list();
- 173
l_equal_list ut_varchar2_list := ut_varchar2_list();
- 173
l_join_by_list ut_varchar2_list := ut_varchar2_list();
- 173
l_not_equal_list ut_varchar2_list := ut_varchar2_list();
procedure add_element_to_list(a_list in out ut_varchar2_list, a_list_element in varchar2)
is
begin
- 2508
if a_list_element is not null then
- 2021
a_list.extend;
- 2021
a_list(a_list.last) := a_list_element;
end if;
end;
begin
- 173
if a_data_info is not empty then
- 627
for i in 1..a_data_info.count loop
- 464
if a_data_info(i).has_nested_col = 0 then
--Get XMLTABLE column list
- 418
add_element_to_list(l_xmltab_list,generate_xmltab_stmt(a_data_info(i)));
--Get Select statment list of columns
- 418
add_element_to_list(l_select_list, generate_select_stmt(a_data_info(i)));
--Get columns by which we partition
- 418
add_element_to_list(l_partition_list,generate_partition_stmt(a_data_info(i), a_pk_table));
--Get equal statement
- 418
add_element_to_list(l_equal_list,generate_equal_sql(a_data_info(i).transformed_name));
--Generate join by stmt
- 418
add_element_to_list(l_join_by_list,generate_join_by_stmt(a_data_info(i), a_pk_table));
--Generate not equal stmt
- 418
add_element_to_list(l_not_equal_list,generate_not_equal_stmt(a_data_info(i), a_pk_table));
end if;
end loop;
- 163
a_xml_stmt := nullif(','||ut_utils.table_to_clob(l_xmltab_list, ' , '),',');
- 163
a_select_stmt := nullif(','||ut_utils.table_to_clob(l_select_list, ' , '),',');
- 163
l_partition_tmp := ut_utils.table_to_clob(l_partition_list, ' , ');
- 163
ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) ');
- 163
if a_pk_table.count > 0 then
-- If key defined do the join or these and where on diffrences
- 34
a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and ');
- 129
elsif a_unordered then
-- If no key defined do the join on all columns
- 27
a_join_by_stmt := ' e.dup_no = a.dup_no and '||ut_utils.table_to_clob(l_equal_list, ' and ');
else
-- Else join on rownumber
- 102
a_join_by_stmt := 'a.item_no = e.item_no ';
end if;
- 163
a_not_equal_stmt := ut_utils.table_to_clob(l_not_equal_list, ' or ');
else
--Partition by piece when no data
- 10
ut_utils.append_to_clob(a_partition_stmt,' 1 ');
- 10
a_join_by_stmt := 'a.item_no = e.item_no ';
end if;
end;
function gen_compare_sql(
a_other ut_data_value_refcursor,
a_join_by_list ut_varchar2_list,
a_unordered boolean,
a_inclusion_type boolean,
a_is_negated boolean
) return clob is
l_compare_sql clob;
l_xmltable_stmt clob;
l_select_stmt clob;
l_partition_stmt clob;
l_join_on_stmt clob;
l_not_equal_stmt clob;
l_where_stmt clob;
l_join_by_list ut_varchar2_list;
function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is
begin
- 173
return
- 1
case
- 1
when a_inclusion_compare and not(a_negated) then ' right outer join '
- 1
when a_inclusion_compare and a_negated then ' inner join '
else ' full outer join '
end;
end;
function get_item_no(a_unordered boolean) return varchar2 is
begin
- 173
return
- 1
case
- 1
when a_unordered then 'row_number() over ( order by nvl(e.item_no,a.item_no))'
else 'nvl(e.item_no,a.item_no) '
end;
end;
begin
/**
* We already estabilished cursor equality so now we add anydata root if we compare anydata
* to join by.
*/
- 173
l_join_by_list :=
- 1
case
- 1
when a_other is of (ut_data_value_anydata) then ut_utils.add_prefix(a_join_by_list, a_other.cursor_details.get_root)
else a_join_by_list
end;
- 173
dbms_lob.createtemporary(l_compare_sql, true);
--Initiate a SQL template with placeholders
- 173
ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template);
--Generate a pieceso of dynamic SQL that will substitute placeholders
- 173
gen_sql_pieces_out_of_cursor(
a_other.cursor_details.cursor_columns_info, l_join_by_list, a_unordered,
l_xmltable_stmt, l_select_stmt, l_partition_stmt, l_join_on_stmt,
l_not_equal_stmt
);
- 173
l_compare_sql := replace(l_compare_sql,'{:duplicate_number:}',l_partition_stmt);
- 173
l_compare_sql := replace(l_compare_sql,'{:columns:}',l_select_stmt);
- 173
l_compare_sql := replace(l_compare_sql,'{:xml_to_columns:}',l_xmltable_stmt);
- 173
l_compare_sql := replace(l_compare_sql,'{:item_no:}',get_item_no(a_unordered));
- 173
l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated));
- 173
l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt);
- 173
if l_not_equal_stmt is not null and ((l_join_by_list.count > 0 and not a_is_negated) or (not a_unordered)) then
- 130
ut_utils.append_to_clob(l_where_stmt,' ( '||l_not_equal_stmt||' ) or ');
end if;
--If its inclusion we expect a actual set to fully match and have no extra elements over expected
- 173
if a_inclusion_type then
- 20
ut_utils.append_to_clob(l_where_stmt,case when a_is_negated then ' 1 = 1 ' else ' ( a.data_id is null ) ' end);
else
- 153
ut_utils.append_to_clob(l_where_stmt,' (a.data_id is null or e.data_id is null) ');
end if;
- 173
l_compare_sql := replace(l_compare_sql,'{:where_condition:}',l_where_stmt);
- 173
return l_compare_sql;
end;
function get_column_extract_path(a_cursor_info ut_cursor_column_tab) return ut_varchar2_list is
- 110
l_column_list ut_varchar2_list := ut_varchar2_list();
begin
- 394
for i in 1..a_cursor_info.count loop
- 284
l_column_list.extend;
- 284
l_column_list(l_column_list.last) := a_cursor_info(i).access_path;
end loop;
- 110
return l_column_list;
end;
function get_rows_diff_by_sql(
a_act_cursor_info ut_cursor_column_tab, a_exp_cursor_info ut_cursor_column_tab,
a_expected_dataset_guid raw, a_actual_dataset_guid raw, a_diff_id raw,
a_join_by_list ut_varchar2_list, a_unordered boolean, a_enforce_column_order boolean := false,
a_extract_path varchar2
) return tt_row_diffs is
- 55
l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info));
- 55
l_exp_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_exp_cursor_info));
- 55
l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list);
l_results tt_row_diffs;
l_sql varchar2(32767);
begin
- 55
l_sql := q'[
with exp as (
select
exp_item_data, exp_data_id, item_no rn, rownum col_no, pk_value,
s.column_value col, s.column_value.getRootElement() col_name,
nvl(s.column_value.getclobval(),empty_clob()) col_val
from (
select
exp_data_id, extract( ucd.exp_item_data, :column_path ) exp_item_data, item_no,
replace( extract( ucd.exp_item_data, :join_by ).getclobval(), chr(10) ) pk_value
from ut_compound_data_diff_tmp ucd
where diff_id = :diff_id
and ucd.exp_data_id = :self_guid
) i,
table( xmlsequence( extract(i.exp_item_data,:extract_path) ) ) s
),
act as (
select
act_item_data, act_data_id, item_no rn, rownum col_no, pk_value,
s.column_value col, s.column_value.getRootElement() col_name,
nvl(s.column_value.getclobval(),empty_clob()) col_val
from (
select
act_data_id, extract( ucd.act_item_data, :column_path ) act_item_data, item_no,
replace( extract( ucd.act_item_data, :join_by ).getclobval(), chr(10) ) pk_value
from ut_compound_data_diff_tmp ucd
where diff_id = :diff_id
and ucd.act_data_id = :other_guid
) i,
table( xmlsequence( extract(i.act_item_data,:extract_path) ) ) s
)
select rn, diff_type, diffed_row, pk_value pk_value
from (
select rn, diff_type, diffed_row, pk_value,
case when diff_type = 'Actual:' then 1 else 2 end rnk,
1 final_order,
col_name
from ( ]'
- 1
|| case when a_unordered then q'[
select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, pk_value, col_name
from (
select nvl(exp.rn, act.rn) rn,
nvl(exp.pk_value, act.pk_value) pk_value,
exp.col exp_item,
act.col act_item,
nvl(exp.col_name,act.col_name) col_name
from exp
join act
on exp.rn = act.rn and exp.col_name = act.col_name
where dbms_lob.compare(exp.col_val, act.col_val) != 0
)
unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) ]'
else q'[
select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value, col_name
from (
select nvl(exp.rn, act.rn) rn,
xmlagg(exp.col order by exp.col_no) exp_item,
xmlagg(act.col order by act.col_no) act_item,
max(nvl(exp.col_name,act.col_name)) col_name
from exp exp
join act act
on exp.rn = act.rn and exp.col_name = act.col_name
where dbms_lob.compare(exp.col_val, act.col_val) != 0
group by (exp.rn, act.rn)
)
unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) ]'
end ||q'[
)
union all
select
item_no as rn,
case when exp_data_id is null then 'Extra:' else 'Missing:' end as diff_type,
xmlserialize(
content (
extract( (case when exp_data_id is null then act_item_data else exp_item_data end),'/*/*')
) no indent
) diffed_row,
nvl2(
:join_by,
replace(
extract( case when exp_data_id is null then act_item_data else exp_item_data end, :join_by ).getclobval(),
chr(10)
),
null
) pk_value,
case when exp_data_id is null then 1 else 2 end rnk,
2 final_order,
null col_name
from ut_compound_data_diff_tmp i
where diff_id = :diff_id
and act_data_id is null or exp_data_id is null
)
order by final_order,]'
- 5/6 1
||case when a_enforce_column_order or (not(a_enforce_column_order) and not(a_unordered)) then
q'[
case when final_order = 1 then rn else rnk end,
case when final_order = 1 then rnk else rn end
]'
- 1
when a_unordered then
q'[
case when final_order = 1 then col_name else to_char(rnk) end,
case when final_order = 1 then to_char(rn) else col_name end,
case when final_order = 1 then to_char(rnk) else col_name end
]'
else
null
end;
- 55
execute immediate l_sql
bulk collect into l_results
using l_exp_extract_xpath, l_join_xpath, a_diff_id, a_expected_dataset_guid,a_extract_path,
l_act_extract_xpath, l_join_xpath, a_diff_id, a_actual_dataset_guid,a_extract_path,
l_join_xpath, l_join_xpath, a_diff_id;
- 55
return l_results;
end;
function get_fixed_size_hash(a_string varchar2, a_base integer :=0,a_size integer := 9999999) return number is
begin
- 383
return dbms_utility.get_hash_value(a_string,a_base,a_size);
end;
procedure insert_diffs_result(a_diff_tab t_diff_tab, a_diff_id raw) is
begin
- 173
forall idx in 1..a_diff_tab.count save exceptions
insert into ut_compound_data_diff_tmp
( diff_id, act_item_data, act_data_id, exp_item_data, exp_data_id, item_no, duplicate_no )
values
(a_diff_id,
xmlelement( name "ROW", a_diff_tab(idx).act_item_data), a_diff_tab(idx).act_data_id,
xmlelement( name "ROW", a_diff_tab(idx).exp_item_data), a_diff_tab(idx).exp_data_id,
a_diff_tab(idx).item_no, a_diff_tab(idx).dup_no);
exception
when ut_utils.ex_failure_for_all then
raise_application_error(ut_utils.gc_dml_for_all,'Failure to insert a diff tmp data.');
end;
procedure set_rows_diff(a_rows_diff integer) is
begin
- 173
g_diff_count := a_rows_diff;
end;
procedure cleanup_diff is
begin
- 570
g_diff_count := 0;
end;
function get_rows_diff_count return integer is
begin
- 161
return g_diff_count;
end;
function is_sql_compare_allowed(a_type_name varchar2)
return boolean is
l_assert boolean;
begin
--clob/blob/xmltype/object/nestedcursor/nestedtable
- 1107
if a_type_name IN (g_type_name_map(dbms_sql.blob_type),
- 1
g_type_name_map(dbms_sql.clob_type),
- 1
g_type_name_map(dbms_sql.long_type),
- 1
g_type_name_map(dbms_sql.long_raw_type),
- 1
g_type_name_map(dbms_sql.bfile_type),
- 1
g_anytype_name_map(dbms_types.typecode_namedcollection))
then
- 18
l_assert := false;
else
- 1089
l_assert := true;
end if;
- 1107
return l_assert;
end;
function get_column_type_desc(a_type_code in integer, a_dbms_sql_desc in boolean)
return varchar2 is
begin
- 1226
return
- 1
case
- 1
when a_dbms_sql_desc then g_type_name_map(a_type_code)
else g_anytype_name_map(a_type_code)
end;
end;
function get_compare_cursor(a_diff_cursor_text in clob,a_self_id raw, a_other_id raw) return sys_refcursor is
l_diff_cursor sys_refcursor;
begin
- 173
open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id;
- 173
return l_diff_cursor;
end;
function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is
begin
- 4
return 'SQL exception thrown when fetching data from cursor:'||
ut_utils.remove_error_from_stack(sqlerrm,ut_utils.gc_xml_processing)||chr(10)||
ut_expectation_processor.who_called_expectation(a_error_stack)||chr(10)||
'Check the query and data for errors.';
end;
procedure save_cursor_data_for_diff(a_data_id raw, a_set_id integer, a_xml xmltype) is
begin
- 363
insert into ut_compound_data_tmp (data_id, item_no, item_data) values (a_data_id, a_set_id, a_xml);
end;
function get_row_data_as_xml(a_data_id raw, a_max_rows integer) return ut_utils.t_clob_tab is
l_results ut_utils.t_clob_tab;
begin
- 50
select xmlserialize( content ucd.item_data no indent)
bulk collect into l_results
from ut_compound_data_tmp tmp
,xmltable ( '/ROWSET' passing tmp.item_data
columns item_data xmltype PATH '*'
) ucd
where tmp.data_id = a_data_id
and rownum <= a_max_rows;
- 50
return l_results;
end;
function type_no_length ( a_type_name varchar2) return boolean is
begin
- 396
return case
- 1
when g_type_no_length_map.exists(a_type_name) then
true
else
false
end;
end;
function compare_json_data(a_act_json_data ut_json_leaf_tab,a_exp_json_data ut_json_leaf_tab) return tt_json_diff_tab is
- 10
l_result_diff tt_json_diff_tab := tt_json_diff_tab();
begin
- 10
with
differences as (
select case
when (a.element_name is null or e.element_name is null) then gc_json_missing
when a.json_type != e.json_type then gc_json_type
when (decode(a.element_value,e.element_value,1,0) = 0) then gc_json_notequal
else gc_json_unknown
end as difference_type,
case
when (a.element_name is null or e.element_name is null) then 1
when a.json_type != e.json_type then 2
when (decode(a.element_value,e.element_value,1,0) = 0) then 3
else 4
end as order_by_type,
a.element_name as act_element_name,
a.element_value as act_element_value,
a.hierarchy_level as act_hierarchy_level,
a.index_position as act_index_position,
a.json_type as act_json_type,
a.access_path as act_access_path,
a.parent_name as act_par_name,
a.parent_path as act_parent_path,
e.element_name as exp_element_name,
e.element_value as exp_element_value,
e.hierarchy_level as exp_hierarchy_level,
e.index_position as exp_index_position,
e.json_type as exp_json_type,
e.access_path as exp_access_path,
e.parent_name as exp_par_name,
e.parent_path as exp_parent_path
from table(a_act_json_data) a
full outer join table(a_exp_json_data) e
on decode(a.parent_name,e.parent_name,1,0)= 1
and decode(a.parent_path,e.parent_path,1,0)= 1
and (
case when a.parent_type = 'object' or e.parent_type = 'object' then
decode(a.element_name,e.element_name,1,0)
else 1 end = 1
)
and (
case when a.parent_type = 'array' or e.parent_type = 'array' then
decode(a.index_position,e.index_position,1,0)
else 1 end = 1
)
and a.hierarchy_level = e.hierarchy_level
where (a.element_name is null or e.element_name is null)
or (a.json_type != e.json_type)
or (decode(a.element_value,e.element_value,1,0) = 0)
)
select difference_type,
act_element_name, act_element_value, act_json_type, act_access_path, act_parent_path,
exp_element_name, exp_element_value, exp_json_type, exp_access_path, exp_parent_path
bulk collect into l_result_diff
from differences a
where not exists (
select 1 from differences b
where (a.act_par_name = b.act_element_name and a.act_hierarchy_level - 1 = b.act_hierarchy_level)
or (a.exp_par_name = b.exp_element_name and a.exp_hierarchy_level - 1 = b.exp_hierarchy_level)
and a.difference_type = gc_json_missing and b.difference_type = gc_json_missing
)
order by order_by_type,
nvl(act_hierarchy_level,exp_hierarchy_level),
nvl(act_index_position,exp_index_position) nulls first,
nvl(act_element_name,exp_element_name) ;
- 10
return l_result_diff;
end;
function insert_json_diffs(a_diff_id raw, a_act_json_data ut_json_leaf_tab, a_exp_json_data ut_json_leaf_tab) return integer is
- 10
l_diffs tt_json_diff_tab := compare_json_data(a_act_json_data,a_exp_json_data);
begin
- 10
forall i in 1..l_diffs.count
- 1
insert into ut_json_data_diff_tmp (
diff_id, difference_type,
act_element_name, act_element_value, act_json_type, act_access_path, act_parent_path,
exp_element_name, exp_element_value, exp_json_type, exp_access_path, exp_parent_path
)
values (
a_diff_id,l_diffs(i).difference_type,
l_diffs(i).act_element_name,l_diffs(i).act_element_value,l_diffs(i).act_json_type, l_diffs(i).act_access_path, l_diffs(i).act_parent_path,
l_diffs(i).exp_element_name,l_diffs(i).exp_element_value,l_diffs(i).exp_json_type,l_diffs(i).exp_access_path, l_diffs(i).exp_parent_path
);
- 10
return l_diffs.count;
end;
function get_json_diffs_type(a_diff_id raw) return tt_json_diff_type_tab is
- 10
l_diffs_summary tt_json_diff_type_tab := tt_json_diff_type_tab();
begin
- 10
select d.difference_type,count(1)
bulk collect into l_diffs_summary
from ut_json_data_diff_tmp d
where diff_id = a_diff_id
group by d.difference_type;
- 10
return l_diffs_summary;
end;
function get_json_diffs_tmp(a_diff_id raw) return tt_json_diff_tab is
l_diffs tt_json_diff_tab;
begin
- 10
select difference_type,
act_element_name, act_element_value, act_json_type, act_access_path, act_parent_path,
exp_element_name, exp_element_value, exp_json_type, exp_access_path, exp_parent_path
bulk collect into l_diffs
from ut_json_data_diff_tmp
where diff_id = a_diff_id;
- 10
return l_diffs;
end;
begin
- 2
g_anytype_name_map(dbms_types.typecode_date) := 'DATE';
- 1
g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER';
- 1
g_anytype_name_map(3 /*INTEGER in object type*/) := 'NUMBER';
- 1
g_anytype_name_map(dbms_types.typecode_raw) := 'RAW';
- 1
g_anytype_name_map(dbms_types.typecode_char) := 'CHAR';
- 1
g_anytype_name_map(dbms_types.typecode_varchar2) := 'VARCHAR2';
- 1
g_anytype_name_map(dbms_types.typecode_varchar) := 'VARCHAR';
- 1
g_anytype_name_map(dbms_types.typecode_blob) := 'BLOB';
- 1
g_anytype_name_map(dbms_types.typecode_bfile) := 'BFILE';
- 1
g_anytype_name_map(dbms_types.typecode_clob) := 'CLOB';
- 1
g_anytype_name_map(dbms_types.typecode_timestamp) := 'TIMESTAMP';
- 1
g_anytype_name_map(dbms_types.typecode_timestamp_tz) := 'TIMESTAMP WITH TIME ZONE';
- 1
g_anytype_name_map(dbms_types.typecode_timestamp_ltz) := 'TIMESTAMP WITH LOCAL TIME ZONE';
- 1
g_anytype_name_map(dbms_types.typecode_interval_ym) := 'INTERVAL YEAR TO MONTH';
- 1
g_anytype_name_map(dbms_types.typecode_interval_ds) := 'INTERVAL DAY TO SECOND';
- 1
g_anytype_name_map(dbms_types.typecode_bfloat) := 'BINARY_FLOAT';
- 1
g_anytype_name_map(dbms_types.typecode_bdouble) := 'BINARY_DOUBLE';
- 1
g_anytype_name_map(dbms_types.typecode_urowid) := 'UROWID';
- 1
g_anytype_name_map(dbms_types.typecode_varray) := 'VARRRAY';
- 1
g_anytype_name_map(dbms_types.typecode_table) := 'TABLE';
- 1
g_anytype_name_map(dbms_types.typecode_namedcollection) := 'NAMEDCOLLECTION';
- 1
g_anytype_name_map(dbms_types.typecode_object) := 'OBJECT';
- 2
g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE';
- 1
g_type_name_map( dbms_sql.bfile_type ) := 'BFILE';
- 1
g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT';
- 1
g_type_name_map( dbms_sql.blob_type ) := 'BLOB';
- 1
g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW';
- 1
g_type_name_map( dbms_sql.char_type ) := 'CHAR';
- 1
g_type_name_map( dbms_sql.clob_type ) := 'CLOB';
- 1
g_type_name_map( dbms_sql.long_type ) := 'LONG';
- 1
g_type_name_map( dbms_sql.date_type ) := 'DATE';
- 1
g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND';
- 1
g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH';
- 1
g_type_name_map( dbms_sql.raw_type ) := 'RAW';
- 1
g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP';
- 1
g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE';
- 1
g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE';
- 1
g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2';
- 1
g_type_name_map( dbms_sql.number_type ) := 'NUMBER';
- 1
g_type_name_map( dbms_sql.rowid_type ) := 'ROWID';
- 1
g_type_name_map( dbms_sql.urowid_type ) := 'UROWID';
- 1
g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE';
- 1
g_type_name_map( dbms_sql.ref_type ) := 'REF_TYPE';
/**
* List of types that have no length but can produce a max_len from desc_cursor function.
*/
- 1
g_type_no_length_map('ROWID') := 'ROWID';
- 1
g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND';
- 1
g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH';
- 1
g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE';
- 1
g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT';
end;
UT3.UT_COMPOUND_DATA_VALUE
100 % lines covered
12 relevant lines. 12 lines covered and 0 lines missed
type body ut_compound_data_value as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member function get_elements_count_info return varchar2 is
begin
- 364
return case when elements_count is null then ' [ null ]' else ' [ count = '||elements_count||' ]' end;
end;
overriding member function get_object_info return varchar2 is
begin
- 270
return self.data_type||get_elements_count_info();
end;
overriding member function is_null return boolean is
begin
- 1362
return ut_utils.int_to_boolean(self.is_data_null);
end;
overriding member function is_diffable return boolean is
begin
- 179
return true;
end;
overriding member function is_multi_line return boolean is
begin
- 79
return not self.is_null();
end;
overriding member function to_string return varchar2 is
l_result clob;
l_result_string varchar2(32767);
begin
- 50
if not self.is_null() then
- 50
dbms_lob.createtemporary(l_result, true);
- 50
ut_utils.append_to_clob(l_result,'Data:'||chr(10));
- 50
ut_utils.append_to_clob(
l_result,
ut_compound_data_helper.get_row_data_as_xml( self.data_id, ut_utils.gc_diff_max_rows )
);
- 50
l_result_string := ut_utils.to_string(l_result,null);
- 50
dbms_lob.freetemporary(l_result);
end if;
- 50
return l_result_string;
end;
end;
UT3.UT_CURSOR_COLUMN
95.83 % lines covered
24 relevant lines. 23 lines covered and 1 lines missed
type body ut_cursor_column as
member procedure init(
self in out nocopy ut_cursor_column,
a_col_name varchar2, a_col_schema_name varchar2,
a_col_type_name varchar2, a_col_max_len integer, a_parent_name varchar2 := null, a_hierarchy_level integer := 1,
a_col_position integer, a_col_type varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer,
a_col_scale integer
) is
begin
- 1226
self.parent_name := a_parent_name; --Name of the parent if its nested
- 1226
self.hierarchy_level := a_hierarchy_level; --Hierarchy level
- 1226
self.column_position := a_col_position; --Position of the column in cursor/ type
- 1226
self.column_len := a_col_max_len; --length of column
- 1226
self.column_precision := a_col_precision;
- 1226
self.column_scale := a_col_scale;
- 1226
self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column
- 1226
self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2
- 1226
self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name);
- 1226
self.display_path := case when a_access_path is null then
self.column_name
else
a_access_path||'/'||self.column_name
end; --Access path used for incldue exclude eg/ TEST_DUMMY_OBJECT/VARCHAR2
- 1226
self.access_path := case when a_access_path is null then
self.xml_valid_name
else
a_access_path||'/'||self.xml_valid_name
end; --Access path used for XMLTABLE query
- 1226
self.filter_path := '/'||self.access_path; --Filter path will differ from access path in anydata type
- 1226
self.transformed_name := case when length(self.xml_valid_name) > 30 then
'"'||ut_compound_data_helper.get_fixed_size_hash(self.parent_name||self.xml_valid_name)||'"'
- 1
when self.parent_name is null then
'"'||self.xml_valid_name||'"'
else
'"'||ut_compound_data_helper.get_fixed_size_hash(self.parent_name||self.xml_valid_name)||'"'
end; --when is nestd we need to hash name to make sure we dont exceed 30 char
- 1226
self.column_type := a_col_type; --column type e.g. user_defined , varchar2
- 1226
self.column_schema := a_col_schema_name; -- schema name
- 1226
self.is_sql_diffable := case
- 1
when lower(self.column_type) = 'user_defined_type' then
0
-- Due to bug in 11g/12.1 collection fails on varchar 4000+
- 1
when (lower(self.column_type) in ('varchar2','char')) and (self.column_len > 4000) then
0
else
ut_utils.boolean_to_int(ut_compound_data_helper.is_sql_compare_allowed(self.column_type))
end; --can we directly compare or do we need to hash value
- 1226
self.is_collection := a_collection;
- 1226
self.has_nested_col := case when lower(self.column_type) = 'user_defined_type' and self.is_collection = 0 then 1 else 0 end;
end;
constructor function ut_cursor_column( self in out nocopy ut_cursor_column,
a_col_name varchar2, a_col_schema_name varchar2,
a_col_type_name varchar2, a_col_max_len integer, a_parent_name varchar2 := null, a_hierarchy_level integer := 1,
a_col_position integer, a_col_type in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer,
a_col_scale integer
) return self as result is
begin
- 1226
init(a_col_name, a_col_schema_name, a_col_type_name, a_col_max_len, a_parent_name,a_hierarchy_level, a_col_position,
a_col_type, a_collection,a_access_path,a_col_precision,a_col_scale);
- 1226
return;
end;
constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result is
begin
return;
end;
end;
UT3.UT_CURSOR_DETAILS
100 % lines covered
62 relevant lines. 62 lines covered and 0 lines missed
type body ut_cursor_details as
member function equals( a_other ut_cursor_details, a_match_options ut_matcher_options ) return boolean is
l_diffs integer;
begin
- 161
select count(1) into l_diffs
from table(self.cursor_columns_info) a
full outer join table(a_other.cursor_columns_info) e
on decode(a.parent_name,e.parent_name,1,0)= 1
and a.column_name = e.column_name
and replace(a.column_type,'VARCHAR2','CHAR') = replace(e.column_type,'VARCHAR2','CHAR')
and ( a.column_position = e.column_position or a_match_options.columns_are_unordered_flag = 1 )
where a.column_name is null or e.column_name is null;
- 161
return l_diffs = 0;
end;
member procedure desc_compound_data(
self in out nocopy ut_cursor_details, a_compound_data anytype,
a_parent_name in varchar2, a_level in integer, a_access_path in varchar2
) is
- 145
l_idx pls_integer := 1;
l_elements_info ut_metadata.t_anytype_members_rec;
l_element_info ut_metadata.t_anytype_elem_info_rec;
l_is_collection boolean;
begin
- 145
l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data );
- 145
l_is_collection := ut_metadata.is_collection(l_elements_info.type_code);
- 145
if l_elements_info.elements_count is null then
- 16
l_element_info := ut_metadata.get_attr_elem_info( a_compound_data );
- 16
self.cursor_columns_info.extend;
- 16
self.cursor_columns_info(cursor_columns_info.last) :=
ut_cursor_column(
l_elements_info.type_name,
l_elements_info.schema_name,
null,
l_elements_info.length,
a_parent_name,
a_level,
l_idx,
ut_compound_data_helper.get_column_type_desc(l_elements_info.type_code,false),
ut_utils.boolean_to_int(l_is_collection),
a_access_path,
l_elements_info.precision,
l_elements_info.scale
);
- 16
if l_element_info.attr_elt_type is not null then
- 16
desc_compound_data(
l_element_info.attr_elt_type, l_elements_info.type_name,
a_level + 1, a_access_path || '/' || l_elements_info.type_name
);
end if;
else
- 494
while l_idx <= l_elements_info.elements_count loop
- 365
l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx );
- 365
self.cursor_columns_info.extend;
- 365
self.cursor_columns_info(cursor_columns_info.last) :=
ut_cursor_column(
l_element_info.attribute_name,
l_elements_info.schema_name,
null,
l_element_info.length,
a_parent_name,
a_level,
l_idx,
ut_compound_data_helper.get_column_type_desc(l_element_info.type_code,false),
ut_utils.boolean_to_int(l_is_collection),
a_access_path,
l_elements_info.precision,
l_elements_info.scale
);
- 365
if l_element_info.attr_elt_type is not null then
- 10
desc_compound_data(
l_element_info.attr_elt_type, l_element_info.attribute_name,
a_level + 1, a_access_path || '/' || l_element_info.attribute_name
);
end if;
- 365
l_idx := l_idx + 1;
end loop;
end if;
end;
constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result is
begin
- 454
self.cursor_columns_info := ut_cursor_column_tab();
- 454
return;
end;
constructor function ut_cursor_details(
self in out nocopy ut_cursor_details,
a_cursor_number in number
) return self as result is
l_columns_count pls_integer;
l_columns_desc dbms_sql.desc_tab3;
l_is_collection boolean;
- 393
l_hierarchy_level integer := 1;
begin
- 393
self.cursor_columns_info := ut_cursor_column_tab();
- 393
self.is_anydata := 0;
- 393
dbms_sql.describe_columns3(a_cursor_number, l_columns_count, l_columns_desc);
/**
* Due to a bug with object being part of cursor in ANYDATA scenario
* oracle fails to revert number to cursor. We ar using dbms_sql.close cursor to close it
* to avoid leaving open cursors behind.
* a_cursor := dbms_sql.to_refcursor(l_cursor_number);
**/
- 1238
for pos in 1 .. l_columns_count loop
- 845
l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name );
- 845
self.cursor_columns_info.extend;
- 845
self.cursor_columns_info(self.cursor_columns_info.last) :=
ut_cursor_column(
l_columns_desc(pos).col_name,
l_columns_desc(pos).col_schema_name,
l_columns_desc(pos).col_type_name,
l_columns_desc(pos).col_max_len,
null,
l_hierarchy_level,
pos,
ut_compound_data_helper.get_column_type_desc(l_columns_desc(pos).col_type,true),
ut_utils.boolean_to_int(l_is_collection),
null,
l_columns_desc(pos).col_precision,
l_columns_desc(pos).col_scale
);
- 845
if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then
- 119
desc_compound_data(
ut_metadata.get_user_defined_type( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ),
l_columns_desc(pos).col_name,
l_hierarchy_level + 1,
l_columns_desc(pos).col_name
);
end if;
end loop;
- 393
return;
end;
member function contains_collection return boolean is
l_collection_elements number;
begin
- 15
select count(1) into l_collection_elements
from table(cursor_columns_info) c
where c.is_collection = 1 and rownum = 1;
- 15
return l_collection_elements > 0;
end;
member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list is
l_result ut_varchar2_list;
begin
--regexp_replace(c.access_path,'^\/?([^\/]+\/){1}')
- 162
select fl.column_value
bulk collect into l_result
from table(a_expected_columns) fl
where not exists (
select 1 from table(self.cursor_columns_info) c
where regexp_like(c.filter_path,'^/?'||fl.column_value||'($|/.*)' )
)
order by fl.column_value;
- 162
return l_result;
end;
member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is
- 700
l_result ut_cursor_details := self;
- 700
l_column_tab ut_cursor_column_tab := ut_cursor_column_tab();
l_column ut_cursor_column;
- 700
c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)';
begin
- 700
if l_result.cursor_columns_info is not null then
--limit columns to those on the include items minus exclude items
- 700
if a_match_options.include.items.count > 0 then
-- if include - exclude = 0 then keep all columns
- 86
if a_match_options.include.items != a_match_options.exclude.items then
- 86
with included_columns as (
select regexp_replace( column_value, c_xpath_extract_reg, '\5' ) col_names
from table(a_match_options.include.items)
minus
select regexp_replace( column_value, c_xpath_extract_reg, '\5' ) col_names
from table(a_match_options.exclude.items)
)
select value(x)
bulk collect into l_result.cursor_columns_info
from table(self.cursor_columns_info) x
where exists(
select 1 from included_columns f where regexp_like(x.filter_path,'^/?'||f.col_names||'($|/.*)' )
)
or x.hierarchy_level = case when self.is_anydata = 1 then 1 else 0 end ;
end if;
- 614
elsif a_match_options.exclude.items.count > 0 then
- 122
with excluded_columns as (
select regexp_replace( column_value, c_xpath_extract_reg, '\5' ) col_names
from table(a_match_options.exclude.items)
)
select value(x)
bulk collect into l_result.cursor_columns_info
from table(self.cursor_columns_info) x
where not exists(
select 1 from excluded_columns f where regexp_like(x.filter_path,'^/?'||f.col_names||'($|/.*)' )
);
end if;
--Rewrite column order after columns been excluded
- 700
for i in (
- 2599
select parent_name, access_path, display_path, has_nested_col,
transformed_name, hierarchy_level,
rownum as new_position, xml_valid_name,
column_name, column_type, column_type_name, column_schema,
column_len, column_precision ,column_scale ,is_sql_diffable, is_collection,value(x) col_info
from table(l_result.cursor_columns_info) x
order by x.column_position asc
) loop
- 1899
l_column := i.col_info;
- 1899
l_column.column_position := i.new_position;
- 1899
l_column_tab.extend;
- 1899
l_column_tab(l_column_tab.last) := l_column;
end loop;
- 700
l_result.cursor_columns_info := l_column_tab;
- 700
self := l_result;
end if;
end;
member function get_xml_children(a_parent_name varchar2 := null) return xmltype is
l_result xmltype;
begin
- 50
select xmlagg(xmlelement(evalname t.column_name,t.column_type_name))
into l_result
from table(self.cursor_columns_info) t
where (a_parent_name is null and parent_name is null and hierarchy_level = 1 and column_name is not null)
having count(*) > 0;
- 50
return l_result;
end;
member function get_root return varchar2 is
l_root varchar2(250);
begin
- 200
if self.cursor_columns_info.count > 0 then
- 192
select x.access_path into l_root from table(self.cursor_columns_info) x
where x.hierarchy_level = 1;
else
- 8
l_root := null;
end if;
- 200
return l_root;
end;
member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) is
- 127
l_root varchar2(250) := get_root();
begin
- 127
self.is_anydata := 1;
- 507
for i in 1..cursor_columns_info.count loop
- 380
self.cursor_columns_info(i).filter_path := '/'||ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root);
end loop;
end;
end;
UT3.UT_DATA_VALUE
93.33 % lines covered
15 relevant lines. 14 lines covered and 1 lines missed
type body ut_data_value as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 428
order member function compare(a_other ut_data_value) return integer is
begin
- 428
return compare_implementation(a_other);
end;
member function is_diffable return boolean is
begin
- 165
return false;
end;
member function is_empty return boolean is
begin
- 2
raise value_error;
end;
member function diff( a_other ut_data_value, a_match_options ut_matcher_options ) return varchar2 is
begin
return null;
end;
member function is_multi_line return boolean is
begin
- 722
return false;
end;
member function get_object_info return varchar2 is
begin
- 746
return self.data_type;
end;
final member function to_string_report(a_add_new_line_for_multi_line boolean := false, a_with_object_info boolean := true) return varchar2 is
l_result varchar2(32767);
l_info varchar2(32767);
begin
- 997
if a_with_object_info then
- 825
l_info := '('||get_object_info()||')';
end if;
- 997
if self.is_multi_line() then
- 74
l_result :=
l_info || chr(10) || ut_utils.indent_lines( rtrim(self.to_string(),chr(10)), a_include_first_line =>true );
- 74
if a_add_new_line_for_multi_line then
- 62
l_result := l_result || chr(10);
end if;
else
- 923
l_result := self.to_string() || ' ' || l_info;
end if;
- 997
return l_result;
end;
end;
UT3.UT_DATA_VALUE_ANYDATA
79.59 % lines covered
49 relevant lines. 39 lines covered and 10 lines missed
type body ut_data_value_anydata as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
overriding member function get_object_info return varchar2 is
begin
- 153
return self.data_type || case when self.compound_type = 'collection' then self.get_elements_count_info() end;
end;
member function get_extract_path(a_data_value anydata) return varchar2 is
l_path varchar2(10);
begin
- 127
if self.compound_type = 'object' then
- 55
l_path := '/*/*';
else
- 144
case when ut_metadata.has_collection_members(a_data_value) then
- 34
l_path := '/*/*';
else
- 38
l_path := '/*';
end case;
end if;
- 127
return l_path;
end;
member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is
l_cursor_sql varchar2(32767);
begin
- 127
l_cursor_sql := '
declare
l_data '||self.data_type||';
l_value anydata := :a_value;
l_status integer;
l_tmp_refcursor sys_refcursor;
begin
l_status := l_value.get'||self.compound_type||'(l_data); '||
- 1
case when self.compound_type = 'collection' then
q'[ open :l_tmp_refcursor for select value(x) as "]'||
ut_metadata.get_object_name(ut_metadata.get_collection_element(a_data_value))||
q'[" from table(l_data) x;]'
else
q'[ open :l_tmp_refcursor for select l_data as "]'||ut_metadata.get_object_name(self.data_type)||
q'[" from dual;]'
end ||
'end;';
- 127
return l_cursor_sql;
end;
member procedure init(self in out nocopy ut_data_value_anydata, a_value anydata) is
l_refcursor sys_refcursor;
cursor_not_open exception;
l_cursor_number number;
l_anydata_sql varchar2(32767);
begin
- 173
self.data_type := ut_metadata.get_anydata_typename(a_value);
- 173
self.compound_type := get_instance(a_value);
- 173
self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type);
- 173
self.data_id := sys_guid();
- 173
self.self_type := $$plsql_unit;
- 173
self.cursor_details := ut_cursor_details();
- 284
ut_compound_data_helper.cleanup_diff;
- 173
if not self.is_null() then
- 127
self.extract_path := get_extract_path(a_value);
- 127
l_anydata_sql := get_cursor_sql_from_anydata(a_value);
- 127
execute immediate l_anydata_sql using in a_value, in out l_refcursor;
- 127
if l_refcursor%isopen then
- 127
self.extract_cursor(l_refcursor);
- 127
l_cursor_number := dbms_sql.to_cursor_number(l_refcursor);
- 127
self.cursor_details := ut_cursor_details(l_cursor_number);
- 127
self.cursor_details.strip_root_from_anydata;
- 127
dbms_sql.close_cursor(l_cursor_number);
elsif not l_refcursor%isopen then
raise cursor_not_open;
end if;
end if;
exception
when cursor_not_open then
raise_application_error(-20155, 'Cursor is not open');
when others then
if l_refcursor%isopen then
close l_refcursor;
end if;
raise;
end;
member function get_instance(a_data_value anydata) return varchar2 is
l_result varchar2(30);
begin
- 173
l_result := ut_metadata.get_anydata_compound_type(a_data_value);
- 173
if l_result not in ('object','collection') then
raise_application_error(-20000, 'Data type '||a_data_value.gettypename||' in ANYDATA is not supported by utPLSQL');
end if;
- 173
return l_result;
end;
constructor function ut_data_value_anydata(self in out nocopy ut_data_value_anydata, a_value anydata) return self as result
is
begin
- 173
init(a_value);
- 173
return;
end;
overriding member function compare_implementation(
a_other ut_data_value,
a_match_options ut_matcher_options,
a_inclusion_compare boolean := false,
a_is_negated boolean := false
) return integer is
- 57
l_result integer := 0;
begin
- 57
if not a_other is of (ut_data_value_anydata) then
raise value_error;
end if;
- 57
l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated);
- 57
return l_result;
end;
overriding member function is_empty return boolean is
begin
- 10
if self.compound_type = 'collection' then
- 6
return self.elements_count = 0;
else
- 4
raise value_error;
end if;
end;
end;
UT3.UT_DATA_VALUE_BLOB
100 % lines covered
15 relevant lines. 15 lines covered and 0 lines missed
type body ut_data_value_blob as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_blob(self in out nocopy ut_data_value_blob, a_value blob) return self as result is
begin
- 38
self.data_value := a_value;
- 38
self.self_type := $$plsql_unit;
- 38
self.data_type := 'blob';
- 38
return;
end;
overriding member function is_null return boolean is
begin
- 58
return (self.data_value is null);
end;
overriding member function is_empty return boolean is
- 4
l_result boolean := false;
begin
- 4
if self.data_value is not null and dbms_lob.compare( self.data_value, empty_blob()) = 0 then
- 2
l_result := true;
end if;
- 4
return l_result;
end;
overriding member function to_string return varchar2 is
begin
- 35
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_blob;
begin
- 8
if a_other is of (ut_data_value_blob) then
- 8
l_other := treat(a_other as ut_data_value_blob);
- 8
l_result := dbms_lob.compare( self.data_value, l_other.data_value);
end if;
- 8
return l_result;
end;
overriding member function is_multi_line return boolean is
begin
- 29
return not self.is_null() and dbms_lob.getlength(self.data_value) > 100;
end;
end;
UT3.UT_DATA_VALUE_BOOLEAN
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_boolean as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_boolean(self in out nocopy ut_data_value_boolean, a_value boolean) return self as result is
begin
- 42
self.data_value := ut_utils.boolean_to_int(a_value);
- 42
self.self_type := $$plsql_unit;
- 42
self.data_type := 'boolean';
- 42
return;
end;
overriding member function is_null return boolean is
begin
- 28
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 36
return ut_utils.to_string(ut_utils.int_to_boolean(self.data_value));
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_other ut_data_value_boolean;
l_result integer;
begin
- 9
if a_other is of (ut_data_value_boolean) then
- 9
l_other := treat(a_other as ut_data_value_boolean);
- 9
if self.data_value = l_other.data_value then
- 1
l_result := 0;
- 8
elsif self.data_value > l_other.data_value then
- 1
l_result := 1;
- 7
elsif self.data_value < l_other.data_value then
- 1
l_result := -1;
end if;
else
raise value_error;
end if;
- 9
return l_result;
end;
end;
UT3.UT_DATA_VALUE_CLOB
100 % lines covered
15 relevant lines. 15 lines covered and 0 lines missed
type body ut_data_value_clob as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_clob(self in out nocopy ut_data_value_clob, a_value clob) return self as result is
begin
- 63
self.data_value := a_value;
- 63
self.self_type := $$plsql_unit;
- 63
self.data_type := 'clob';
- 63
return;
end;
overriding member function is_null return boolean is
begin
- 74
return (self.data_value is null);
end;
overriding member function is_empty return boolean is
- 4
l_result boolean := false;
begin
- 4
if self.data_value is not null and dbms_lob.compare( self.data_value, empty_clob()) = 0 then
- 2
l_result := true;
end if;
- 4
return l_result;
end;
overriding member function to_string return varchar2 is
begin
- 51
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_clob;
begin
- 8
if a_other is of (ut_data_value_clob) then
- 8
l_other := treat(a_other as ut_data_value_clob);
- 8
l_result := dbms_lob.compare( self.data_value, l_other.data_value);
end if;
- 8
return l_result;
end;
overriding member function is_multi_line return boolean is
begin
- 45
return not self.is_null() and (dbms_lob.getlength(self.data_value) > 100 or dbms_lob.instr(self.data_value,chr(10)) > 0);
end;
end;
UT3.UT_DATA_VALUE_DATE
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_date as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_date(self in out nocopy ut_data_value_date, a_value date) return self as result is
begin
- 86
self.data_value := a_value;
- 86
self.self_type := $$plsql_unit;
- 86
self.data_type := 'date';
- 86
return;
end;
overriding member function is_null return boolean is
begin
- 26
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 80
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_date;
begin
- 40
if a_other is of (ut_data_value_date) then
- 40
l_other := treat(a_other as ut_data_value_date);
- 40
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 35
elsif self.data_value > l_other.data_value then
- 15
l_result := 1;
- 20
elsif self.data_value < l_other.data_value then
- 8
l_result := -1;
end if;
else
raise value_error;
end if;
- 40
return l_result;
end;
end;
UT3.UT_DATA_VALUE_DSINTERVAL
100 % lines covered
15 relevant lines. 15 lines covered and 0 lines missed
type body ut_data_value_dsinterval as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_dsinterval(self in out nocopy ut_data_value_dsinterval, a_value dsinterval_unconstrained) return self as result is
begin
- 76
self.data_value := a_value;
- 76
self.self_type := $$plsql_unit;
- 76
self.data_type := 'interval day to second';
- 76
return;
end;
overriding member function is_null return boolean is
begin
- 20
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 72
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_dsinterval;
begin
- 40
if a_other is of (ut_data_value_dsinterval) then
- 40
l_other := treat(a_other as ut_data_value_dsinterval);
- 40
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 35
elsif self.data_value > l_other.data_value then
- 16
l_result := 1;
- 19
elsif self.data_value < l_other.data_value then
- 7
l_result := -1;
end if;
end if;
- 40
return l_result;
end;
end;
UT3.UT_DATA_VALUE_JSON
98.39 % lines covered
62 relevant lines. 61 lines covered and 1 lines missed
type body ut_data_value_json as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init (self in out nocopy ut_data_value_json, a_value json_element_t) is
begin
- 33
self.is_data_null := case when a_value is null then 1 else 0 end;
- 33
self.data_value := case when a_value is null then null else a_value.to_clob end;
- 33
self.self_type := $$plsql_unit;
- 33
self.data_type := 'json';
- 33
self.json_tree := ut_json_tree_details(a_value);
- 33
self.data_id := sys_guid();
end;
constructor function ut_data_value_json(self in out nocopy ut_data_value_json, a_value json_element_t) return self as result is
begin
- 33
init(a_value);
- 33
return;
end;
overriding member function is_null return boolean is
begin
- 38
return (ut_utils.int_to_boolean(self.is_data_null));
end;
overriding member function is_empty return boolean is
begin
- 4
return self.data_value = '{}';
end;
overriding member function to_string return varchar2 is
begin
- 8
return ut_utils.to_string(self.data_value);
end;
overriding member function diff( a_other ut_data_value, a_match_options ut_matcher_options ) return varchar2 is
l_result clob;
- 10
l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab();
l_result_string varchar2(32767);
l_other ut_data_value_json;
- 10
l_self ut_data_value_json := self;
l_diff_id ut_utils.t_hash;
- 10
c_max_rows integer := ut_utils.gc_diff_max_rows;
l_diffs ut_compound_data_helper.tt_json_diff_tab;
l_message varchar2(32767);
function get_diff_by_type(a_diff_id raw) return clob is
- 10
l_diff_summary ut_compound_data_helper.tt_json_diff_type_tab := ut_compound_data_helper.get_json_diffs_type(a_diff_id);
- 10
l_message_list ut_varchar2_list := ut_varchar2_list();
begin
- 16
for i in 1..l_diff_summary.count loop
- 6
l_message_list.extend;
- 6
l_message_list(l_message_list.last) := l_diff_summary(i).no_of_occurence||' '||l_diff_summary(i).difference_type;
end loop;
- 10
return ut_utils.table_to_clob(l_message_list,', ');
end;
function get_json_diff_text (a_json_diff ut_compound_data_helper.t_json_diff_rec) return clob is
begin
- 41
return
- 1
case
- 1
when a_json_diff.difference_type = ut_compound_data_helper.gc_json_missing
then
- 1
case
- 1
when a_json_diff.act_element_name is not null then q'[ Missing property: ]'||a_json_diff.act_element_name
- 1
when a_json_diff.exp_element_name is not null then q'[ Extra property: ]'||a_json_diff.exp_element_name
end || ' on path: '||nvl(a_json_diff.act_parent_path,a_json_diff.exp_parent_path)
else
- 1
case
- 1
when a_json_diff.difference_type = ut_compound_data_helper.gc_json_type
then q'[ Actual type: ']'||a_json_diff.act_json_type||q'[' was expected to be: ']'||a_json_diff.exp_json_type||q'[']'
- 1
when a_json_diff.difference_type = ut_compound_data_helper.gc_json_notequal
then q'[ Actual value: ]'||a_json_diff.act_element_value||q'[ was expected to be: ]'||a_json_diff.exp_element_value
end || ' on path: '||nvl(a_json_diff.act_access_path,a_json_diff.exp_access_path)
end;
end;
begin
- 10
if not a_other is of (ut_data_value_json) then
raise value_error;
end if;
- 10
dbms_lob.createtemporary(l_result, true);
- 10
l_other := treat(a_other as ut_data_value_json);
- 10
l_diff_id := ut_utils.get_hash(self.data_id||l_other.data_id);
- 10
if not l_self.is_null and not l_other.is_null then
- 10
l_diffs := ut_compound_data_helper.get_json_diffs_tmp(l_diff_id);
- 10
l_message := ' '||l_diffs.count|| ' differences found' ||
- 1
case when l_diffs.count > c_max_rows then ', showing first '|| c_max_rows else null end||chr(10);
- 10
ut_utils.append_to_clob( l_result, l_message );
- 10
l_message := get_diff_by_type(l_diff_id)||chr(10);
- 10
ut_utils.append_to_clob( l_result, l_message );
- 51
for i in 1 .. least( c_max_rows, l_diffs.count ) loop
- 41
l_results.extend;
- 41
l_results(l_results.last) := get_json_diff_text(l_diffs(i));
end loop;
- 10
ut_utils.append_to_clob(l_result, l_results);
end if;
- 10
if l_result != empty_clob() then
- 10
l_result_string := chr(10) || 'Diff:' || ut_utils.to_string(l_result,null);
end if;
- 10
dbms_lob.freetemporary(l_result);
- 10
return l_result_string;
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
- 10
l_self ut_data_value_json := self;
- 10
l_other ut_data_value := a_other;
begin
- 10
return l_self.compare_implementation( l_other, null );
end;
member function compare_implementation(a_other in ut_data_value,a_match_options ut_matcher_options) return
integer is
l_result integer;
l_other ut_data_value_json;
l_diff_id ut_utils.t_hash;
begin
- 10
if a_other is of (ut_data_value_json) then
- 10
l_other := treat(a_other as ut_data_value_json);
- 10
l_diff_id := ut_utils.get_hash(self.data_id||l_other.data_id);
- 10
l_result :=
- 1
case
- 1
when ut_compound_data_helper.insert_json_diffs(
l_diff_id, self.json_tree.json_tree_info, l_other.json_tree.json_tree_info
) > 0 then 1
else 0
end;
end if;
- 10
return l_result;
end;
member function get_elements_count return integer is
begin
- 10
return json_element_t.parse(self.data_value).get_size;
end;
member function get_json_count_info return varchar2 is
begin
- 5
return self.data_type||' [ count = '||self.get_elements_count||' ]';
end;
overriding member function get_object_info return varchar2 is
begin
- 28
return self.data_type;
end;
end;
UT3.UT_DATA_VALUE_NUMBER
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_number as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_number(self in out nocopy ut_data_value_number, a_value number) return self as result is
begin
- 237
self.data_value := a_value;
- 237
self.self_type := $$plsql_unit;
- 237
self.data_type := 'number';
- 237
return;
end;
overriding member function is_null return boolean is
begin
- 60
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 215
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_number;
begin
- 104
if a_other is of (ut_data_value_number) then
- 104
l_other := treat(a_other as ut_data_value_number);
- 104
if self.data_value = l_other.data_value then
- 54
l_result := 0;
- 50
elsif self.data_value > l_other.data_value then
- 29
l_result := 1;
- 21
elsif self.data_value < l_other.data_value then
- 9
l_result := -1;
end if;
else
raise value_error;
end if;
- 104
return l_result;
end;
end;
UT3.UT_DATA_VALUE_REFCURSOR
93.57 % lines covered
171 relevant lines. 160 lines covered and 11 lines missed
type body ut_data_value_refcursor as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor)
return self as result is
begin
- 281
init(a_value);
- 276
return;
end;
member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor)
is
- 397
c_bulk_rows constant integer := 10000;
- 397
l_cursor sys_refcursor := a_value;
l_ctx number;
l_xml xmltype;
- 397
l_ut_owner varchar2(250) := ut_utils.ut_owner;
- 397
l_set_id integer := 0;
- 397
l_elements_count number := 0;
begin
-- We use DBMS_XMLGEN in order to:
-- 1) be able to process data in bulks (set of rows)
-- 2) be able to influence the ROWSET/ROW tags
-- 3) be able to influence the way NULL values are handled (empty TAG)
-- 4) be able to influence the way TIMESTAMP is formatted.
-- Due to Oracle feature/bug, it is not possible to change the DATE formatting of cursor data
-- AFTER the cursor was opened.
-- The only solution for this is to change NLS settings before opening the cursor.
--
-- This would work fine if we could use DBMS_XMLGEN.restartQuery.
-- The restartQuery fails however if PLSQL variables of TIMESTAMP/INTERVAL or CLOB/BLOB are used.
- 621
ut_expectation_processor.set_xml_nls_params();
- 397
l_ctx := dbms_xmlgen.newContext(l_cursor);
- 397
dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag);
- 397
dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows);
- 760
loop
- 760
l_xml := dbms_xmlgen.getxmltype(l_ctx);
- 756
exit when dbms_xmlgen.getNumRowsProcessed(l_ctx) = 0;
--Bug in oracle 12.2+ where XML binary storage trimming insignificant whitespaces.
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
- 363
l_xml := xmltype( replace(l_xml.getClobVal(),'<ROWSET','<ROWSET xml:space=''preserve'''));
$else
null;
$end
- 363
l_elements_count := l_elements_count + dbms_xmlgen.getNumRowsProcessed(l_ctx);
- 363
ut_compound_data_helper.save_cursor_data_for_diff( self.data_id, l_set_id, l_xml );
- 363
l_set_id := l_set_id + c_bulk_rows;
end loop;
- 393
ut_expectation_processor.reset_nls_params();
- 393
dbms_xmlgen.closeContext(l_ctx);
- 393
self.elements_count := l_elements_count;
exception
- 8
when others then
- 4
ut_expectation_processor.reset_nls_params();
- 4
dbms_xmlgen.closeContext(l_ctx);
- 4
raise;
end;
member procedure init(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) is
- 281
l_cursor sys_refcursor := a_value;
cursor_not_open exception;
l_cursor_number number;
begin
- 281
self.is_data_null := ut_utils.boolean_to_int(l_cursor is null);
- 281
self.self_type := $$plsql_unit;
- 281
self.data_id := sys_guid();
- 281
self.data_type := 'refcursor';
- 281
self.compound_type := 'refcursor';
- 281
self.extract_path := '/*';
- 434
ut_compound_data_helper.cleanup_diff;
- 281
self.cursor_details := ut_cursor_details();
- 281
if l_cursor is not null then
- 271
if l_cursor%isopen then
--Get some more info regarding cursor, including if it containts collection columns and what is their name
- 270
extract_cursor(l_cursor);
- 266
l_cursor_number := dbms_sql.to_cursor_number(l_cursor);
- 266
self.cursor_details := ut_cursor_details(l_cursor_number);
- 266
dbms_sql.close_cursor(l_cursor_number);
- 1
elsif not l_cursor%isopen then
- 1
raise cursor_not_open;
end if;
end if;
exception
- 2
when cursor_not_open then
- 1
raise_application_error(-20155, 'Cursor is not open');
- 8
when ut_utils.ex_xml_processing then
- 4
if l_cursor%isopen then
- 4
close l_cursor;
end if;
- 4
raise_application_error(ut_utils.gc_failed_open_cur,
ut_compound_data_helper.create_err_cursor_msg(dbms_utility.format_call_stack()));
when others then
if l_cursor%isopen then
close l_cursor;
end if;
raise;
end;
overriding member function to_string return varchar2 is
l_result clob;
l_result_string varchar2(32767);
begin
- 71
if not self.is_null() then
- 50
dbms_lob.createtemporary(l_result, true);
- 50
ut_utils.append_to_clob(l_result, 'Data-types:'||chr(10));
- 50
if self.cursor_details.cursor_columns_info.count > 0 then
- 50
ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() );
end if;
- 50
ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string());
- 50
l_result_string := ut_utils.to_string(l_result,null);
- 50
dbms_lob.freetemporary(l_result);
end if;
- 71
return l_result_string;
end;
overriding member function diff( a_other ut_data_value, a_match_options ut_matcher_options ) return varchar2 is
l_result clob;
- 169
l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab();
l_result_string varchar2(32767);
l_other ut_data_value_refcursor;
- 169
l_self ut_data_value_refcursor := self;
l_column_diffs ut_compound_data_helper.tt_column_diffs;
l_other_cols ut_cursor_column_tab;
l_self_cols ut_cursor_column_tab;
- 169
l_act_missing_pk ut_varchar2_list := ut_varchar2_list();
- 169
l_exp_missing_pk ut_varchar2_list := ut_varchar2_list();
- 169
c_max_rows integer := ut_utils.gc_diff_max_rows;
l_diff_id ut_utils.t_hash;
l_diff_row_count integer;
l_row_diffs ut_compound_data_helper.tt_row_diffs;
l_message varchar2(32767);
function get_col_diff_text(a_col ut_compound_data_helper.t_column_diffs) return varchar2 is
begin
- 27
return
- 1
case a_col.diff_type
- 1
when '-' then
' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.'
- 1
when '+' then
' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.'
- 1
when 't' then
' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.'
- 1
when 'p' then
' Column <'||a_col.actual_name||'> is misplaced. Expected position: '||a_col.expected_pos||',' ||' actual position: '||a_col.actual_pos||'.'
end;
end;
function remove_incomparable_cols(
a_cursor_details ut_cursor_column_tab, a_column_diffs ut_compound_data_helper.tt_column_diffs
) return ut_cursor_column_tab is
- 24
l_missing_cols ut_varchar2_list := ut_varchar2_list();
l_result ut_cursor_column_tab;
begin
- 78
for i in 1 .. a_column_diffs.count loop
- 54
if a_column_diffs(i).diff_type in ('-','+') then
- 36
l_missing_cols.extend;
- 36
l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name);
end if;
end loop;
- 24
select value(i) bulk collect into l_result
from table(a_cursor_details) i
where i.access_path not in (
select c.column_value
from table(l_missing_cols) c
);
- 24
return l_result;
end;
function get_diff_message (a_row_diff ut_compound_data_helper.t_row_diffs, a_is_unordered boolean) return varchar2 is
begin
- 224
if a_is_unordered then
- 68
if a_row_diff.pk_value is not null then
- 42
return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row;
else
- 26
return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row;
end if;
else
- 156
return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row;
end if;
end;
begin
- 169
if not a_other is of (ut_data_value_refcursor) then
raise value_error;
end if;
- 169
l_other := treat(a_other as ut_data_value_refcursor);
- 169
l_other.cursor_details.filter_columns(a_match_options);
- 169
l_self.cursor_details.filter_columns(a_match_options);
- 169
l_other_cols := l_other.cursor_details.cursor_columns_info;
- 169
l_self_cols := l_self.cursor_details.cursor_columns_info;
- 169
dbms_lob.createtemporary(l_result,true);
--diff columns
- 169
if not l_self.is_null and not l_other.is_null then
- 158
l_column_diffs := ut_compound_data_helper.get_columns_diff(
l_self.cursor_details.cursor_columns_info,
l_other.cursor_details.cursor_columns_info,
a_match_options.ordered_columns()
);
- 158
if l_column_diffs is not empty then
- 12
ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10));
- 12
l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs );
- 12
l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs );
- 39
for i in 1 .. l_column_diffs.count loop
- 27
l_results.extend;
- 27
l_results(l_results.last) := get_col_diff_text(l_column_diffs(i));
end loop;
- 12
ut_utils.append_to_clob(l_result, l_results);
end if;
end if;
--check for missing pk
- 169
if a_match_options.join_by.items.count > 0 then
- 39
l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items );
- 39
l_exp_missing_pk := l_self.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items );
end if;
--diff rows and row elements if the pk is not missing
- 169
if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then
- 161
l_diff_id := ut_utils.get_hash( l_self.data_id || l_other.data_id );
-- First tell how many rows are different
- 161
l_diff_row_count := ut_compound_data_helper.get_rows_diff_count;
- 161
if l_diff_row_count > 0 then
- 55
l_row_diffs := ut_compound_data_helper.get_rows_diff_by_sql(
l_self_cols, l_other_cols, l_self.data_id, l_other.data_id,
l_diff_id,
- 1
case
- 1
when
l_self.cursor_details.is_anydata = 1 then ut_utils.add_prefix(a_match_options.join_by.items, l_self.cursor_details.get_root)
else
a_match_options.join_by.items
end,
a_match_options.unordered,a_match_options.ordered_columns(), self.extract_path
);
- 55
l_message := chr(10)
||'Rows: [ ' || l_diff_row_count ||' differences'
- 1
|| case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end
- 1
||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end;
- 55
ut_utils.append_to_clob( l_result, l_message );
- 55
l_results := ut_utils.t_clob_tab();
- 279
for i in 1 .. l_row_diffs.count loop
- 224
l_results.extend;
- 224
l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered);
end loop;
- 55
ut_utils.append_to_clob(l_result,l_results);
- 106
elsif l_column_diffs is not empty then
- 4
l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.';
- 4
ut_utils.append_to_clob( l_result, l_message );
end if;
else
- 8
ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10));
- 16
for i in 1 .. l_exp_missing_pk.count loop
- 8
ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10));
end loop;
- 16
for i in 1 .. l_act_missing_pk.count loop
- 8
ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10));
end loop;
- 8
if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then
- 1
ut_utils.append_to_clob(l_result,' Please make sure that your join clause is not refferring to collection element'|| chr(10));
end if;
end if;
- 169
if l_result != empty_clob() then
- 67
l_result_string := chr(10) || 'Diff:' || ut_utils.to_string(l_result,null);
end if;
- 169
dbms_lob.freetemporary(l_result);
- 169
return l_result_string;
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
begin
return compare_implementation( a_other, null );
end;
member function compare_implementation(
a_other ut_data_value,
a_match_options ut_matcher_options,
a_inclusion_compare boolean := false,
a_is_negated boolean := false
) return integer is
- 181
l_result integer := 0;
- 181
l_self ut_data_value_refcursor := self;
l_other ut_data_value_refcursor;
l_diff_cursor_text clob;
function compare_data(
a_self ut_data_value_refcursor,
a_other ut_data_value_refcursor,
a_diff_cursor_text clob
) return integer is
l_diff_id ut_utils.t_hash;
l_result integer;
--We will start with number od differences being displayed.
l_cursor sys_refcursor;
l_diff_tab ut_compound_data_helper.t_diff_tab;
- 173
l_diif_rowcount integer :=0;
begin
- 173
l_diff_id := ut_utils.get_hash(a_self.data_id||a_other.data_id);
begin
- 173
l_cursor := ut_compound_data_helper.get_compare_cursor(a_diff_cursor_text,
a_self.data_id, a_other.data_id);
--fetch and save rows for display of diff
- 173
fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_diff_max_rows;
exception when others then
if l_cursor%isopen then
close l_cursor;
end if;
raise;
end;
- 173
ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id );
--fetch rows for count only
- 233
loop
- 233
exit when l_diff_tab.count = 0;
- 60
l_diif_rowcount := l_diif_rowcount + l_diff_tab.count;
- 60
fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit;
end loop;
- 173
ut_compound_data_helper.set_rows_diff(l_diif_rowcount);
--result is OK only if both are same
- 173
if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then
- 113
l_result := 0;
else
- 60
l_result := 1;
end if;
- 173
close l_cursor;
- 173
return l_result;
end;
begin
- 181
if not a_other is of (ut_data_value_refcursor) then
raise value_error;
end if;
- 181
l_other := treat(a_other as ut_data_value_refcursor);
- 181
l_other.cursor_details.filter_columns( a_match_options );
- 181
l_self.cursor_details.filter_columns( a_match_options );
- 181
if a_match_options.join_by.items.count > 0 then
- 42
l_result :=
l_self.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ).count
+ l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ).count;
end if;
- 181
if l_result = 0 then
- 173
if not l_self.is_null() and not l_other.is_null() and not l_self.cursor_details.equals( l_other.cursor_details, a_match_options ) then
- 10
l_result := 1;
end if;
- 173
l_diff_cursor_text := ut_compound_data_helper.gen_compare_sql(
l_other,
a_match_options.join_by.items,
a_match_options.unordered(),
a_inclusion_compare,
a_is_negated
);
- 173
l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text );
end if;
- 181
return l_result;
end;
overriding member function is_empty return boolean is
begin
- 11
return self.elements_count = 0;
end;
end;
UT3.UT_DATA_VALUE_TIMESTAMP
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_timestamp as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_timestamp(self in out nocopy ut_data_value_timestamp, a_value timestamp_unconstrained) return self as result is
begin
- 92
self.data_value := a_value;
- 92
self.self_type := $$plsql_unit;
- 92
self.data_type := 'timestamp';
- 92
return;
end;
overriding member function is_null return boolean is
begin
- 26
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 86
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_timestamp;
begin
- 44
if a_other is of (ut_data_value_timestamp) then
- 44
l_other := treat(a_other as ut_data_value_timestamp);
- 44
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 39
elsif self.data_value > l_other.data_value then
- 18
l_result := 1;
- 21
elsif self.data_value < l_other.data_value then
- 9
l_result := -1;
end if;
else
raise value_error;
end if;
- 44
return l_result;
end;
end;
UT3.UT_DATA_VALUE_TIMESTAMP_LTZ
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_timestamp_ltz as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_timestamp_ltz(self in out nocopy ut_data_value_timestamp_ltz, a_value timestamp_ltz_unconstrained) return self as result is
begin
- 92
self.data_value := a_value;
- 92
self.self_type := $$plsql_unit;
- 92
self.data_type := 'timestamp with local time zone';
- 92
return;
end;
overriding member function is_null return boolean is
begin
- 26
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 86
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_timestamp_ltz;
begin
- 44
if a_other is of (ut_data_value_timestamp_ltz) then
- 44
l_other := treat(a_other as ut_data_value_timestamp_ltz);
- 44
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 39
elsif self.data_value > l_other.data_value then
- 18
l_result := 1;
- 21
elsif self.data_value < l_other.data_value then
- 9
l_result := -1;
end if;
else
raise value_error;
end if;
- 44
return l_result;
end;
end;
UT3.UT_DATA_VALUE_TIMESTAMP_TZ
93.75 % lines covered
16 relevant lines. 15 lines covered and 1 lines missed
type body ut_data_value_timestamp_tz as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_timestamp_tz(self in out nocopy ut_data_value_timestamp_tz, a_value timestamp_tz_unconstrained) return self as result is
begin
- 88
self.data_value := a_value;
- 88
self.self_type := $$plsql_unit;
- 88
self.data_type := 'timestamp with time zone';
- 88
return;
end;
overriding member function is_null return boolean is
begin
- 26
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 86
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_timestamp_tz;
begin
- 44
if a_other is of (ut_data_value_timestamp_tz) then
- 44
l_other := treat(a_other as ut_data_value_timestamp_tz);
- 44
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 39
elsif self.data_value > l_other.data_value then
- 18
l_result := 1;
- 21
elsif self.data_value < l_other.data_value then
- 9
l_result := -1;
end if;
else
raise value_error;
end if;
- 44
return l_result;
end;
end;
UT3.UT_DATA_VALUE_VARCHAR2
94.12 % lines covered
17 relevant lines. 16 lines covered and 1 lines missed
type body ut_data_value_varchar2 as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_varchar2(self in out nocopy ut_data_value_varchar2, a_value varchar2) return self as result is
begin
- 361
self.data_value := a_value;
- 361
self.self_type := $$plsql_unit;
- 361
self.data_type := 'varchar2';
- 361
return;
end;
overriding member function is_null return boolean is
begin
- 174
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 127
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_varchar2;
begin
- 37
if a_other is of (ut_data_value_varchar2) then
- 37
l_other := treat(a_other as ut_data_value_varchar2);
- 37
if self.data_value = l_other.data_value then
- 3
l_result := 0;
- 34
elsif self.data_value > l_other.data_value then
- 16
l_result := 1;
- 18
elsif self.data_value < l_other.data_value then
- 6
l_result := -1;
end if;
else
raise value_error;
end if;
- 37
return l_result;
end;
overriding member function is_multi_line return boolean is
begin
- 122
return not self.is_null() and (length(self.data_value) > 100 or instr(self.data_value,chr(10)) > 0);
end;
end;
UT3.UT_DATA_VALUE_YMINTERVAL
100 % lines covered
15 relevant lines. 15 lines covered and 0 lines missed
type body ut_data_value_yminterval as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_data_value_yminterval(self in out nocopy ut_data_value_yminterval, a_value yminterval_unconstrained) return self as result is
begin
- 76
self.data_value := a_value;
- 76
self.self_type := $$plsql_unit;
- 76
self.data_type := 'interval year to month';
- 76
return;
end;
overriding member function is_null return boolean is
begin
- 20
return (self.data_value is null);
end;
overriding member function to_string return varchar2 is
begin
- 72
return ut_utils.to_string(self.data_value);
end;
overriding member function compare_implementation(a_other ut_data_value) return integer is
l_result integer;
l_other ut_data_value_yminterval;
begin
- 40
if a_other is of (ut_data_value_yminterval) then
- 40
l_other := treat(a_other as ut_data_value_yminterval);
- 40
if self.data_value = l_other.data_value then
- 5
l_result := 0;
- 35
elsif self.data_value > l_other.data_value then
- 16
l_result := 1;
- 19
elsif self.data_value < l_other.data_value then
- 7
l_result := -1;
end if;
end if;
- 40
return l_result;
end;
end;
UT3.UT_JSON_LEAF
100 % lines covered
12 relevant lines. 12 lines covered and 0 lines missed
type body ut_json_leaf as
member procedure init( self in out nocopy ut_json_leaf,
a_element_name varchar2, a_element_value varchar2,a_parent_name varchar2,
a_access_path varchar2, a_hierarchy_level integer, a_index_position integer, a_json_type in varchar2,
a_parent_type varchar2, a_array_element integer:=0, a_parent_path varchar2) is
begin
- 1654
self.element_name := a_element_name;
- 1654
self.element_value := a_element_value;
- 1654
self.parent_name := a_parent_name;
- 1654
self.hierarchy_level := a_hierarchy_level;
- 1654
self.access_path := a_access_path;
- 1654
self.index_position := a_index_position;
- 1654
self.json_type := a_json_type;
- 1654
self.is_array_element := a_array_element;
- 1654
self.parent_type := a_parent_type;
- 1654
self.parent_path := a_parent_path;
end;
constructor function ut_json_leaf( self in out nocopy ut_json_leaf,
a_element_name varchar2, a_element_value varchar2,a_parent_name varchar2,
a_access_path varchar2, a_hierarchy_level integer, a_index_position integer, a_json_type in varchar2,
a_parent_type varchar2, a_array_element integer:=0, a_parent_path varchar2)
return self as result is
begin
- 1654
init(a_element_name,a_element_value,a_parent_name, a_access_path, a_hierarchy_level, a_index_position,
a_json_type,a_parent_type,a_array_element, a_parent_path);
- 1654
return;
end;
end;
UT3.UT_JSON_TREE_DETAILS
93.94 % lines covered
66 relevant lines. 62 lines covered (including 6 lines partially covered ) and 4 lines missed
type body ut_json_tree_details as
member function get_json_type(a_json_piece json_element_t) return varchar2 is
begin
- 1654
return
- 1
case
- 1
when a_json_piece.is_object then 'object'
- 1
when a_json_piece.is_array then 'array'
- 1
when a_json_piece.is_string then 'string'
- 1
when a_json_piece.is_number then 'number'
- 1
when a_json_piece.is_boolean then 'boolean'
- 1
when a_json_piece.is_true then 'true'
- 1
when a_json_piece.is_false then 'false'
- 1
when a_json_piece.is_null then 'null'
when a_json_piece.is_date then 'date'
when a_json_piece.is_timestamp then 'timestamp'
when a_json_piece.is_scalar then 'scalar'
else null
end;
end;
member function get_json_value(a_json_piece json_element_t, a_key varchar2) return varchar2 is
l_json_el json_element_t;
l_val varchar2(4000);
begin
- 1148
l_json_el := treat(a_json_piece as json_object_t).get(a_key);
- 1148
case
- 1855
when l_json_el.is_string then l_val := ut_utils.to_string(l_json_el.to_string(),null);
- 700
when l_json_el.is_number then l_val := ut_utils.to_string(l_json_el.to_number());
- 232
when l_json_el.is_boolean then l_val := ut_utils.to_string(l_json_el.to_boolean());
-- when l_json_el.is_true then l_val := ut_utils.to_string(l_json_el.to_boolean());
-- when l_json_el.is_false then l_val := ut_utils.to_string(l_json_el.to_boolean());
- 1/2 132
when l_json_el.is_date then l_val := ut_utils.to_string(l_json_el.to_date());
- 1/2 132
when l_json_el.is_timestamp then l_val := ut_utils.to_string(l_json_el.to_date());
- 132
else null;
end case;
- 1148
return l_val;
end;
member function get_json_value(a_json_piece json_element_t, a_key integer) return varchar2 is
l_json_el json_element_t;
l_val varchar2(4000);
begin
- 506
l_json_el := treat(a_json_piece as json_array_t).get(a_key);
- 506
case
- 860
when l_json_el.is_string then l_val := ut_utils.to_string(l_json_el.to_string(),null);
- 1/2 152
when l_json_el.is_number then l_val := ut_utils.to_string(l_json_el.to_number());
- 1/2 152
when l_json_el.is_boolean then l_val := ut_utils.to_string(l_json_el.to_boolean());
-- when l_json_el.is_true then l_val := ut_utils.to_string(l_json_el.to_boolean());
-- when l_json_el.is_false then l_val := ut_utils.to_string(l_json_el.to_boolean());
- 1/2 152
when l_json_el.is_date then l_val := ut_utils.to_string(l_json_el.to_date());
- 1/2 152
when l_json_el.is_timestamp then l_val := ut_utils.to_string(l_json_el.to_date());
- 152
else null;
end case;
- 506
return l_val;
end;
member procedure add_json_leaf(
self in out nocopy ut_json_tree_details,
a_element_name varchar2,
a_element_value varchar2,
a_parent_name varchar2,
a_access_path varchar2,
a_hierarchy_level integer,
a_index_position integer,
a_json_type varchar2,
a_parent_type varchar2,
a_array_element integer := 0,
a_parent_path varchar2
) is
begin
- 1654
self.json_tree_info.extend;
- 1654
self.json_tree_info(self.json_tree_info.last) :=
ut_json_leaf(
a_element_name, a_element_value, a_parent_name, a_access_path,
a_hierarchy_level, a_index_position,a_json_type, a_parent_type,
a_array_element, a_parent_path
);
end;
member procedure traverse_object(
self in out nocopy ut_json_tree_details,
a_json_piece json_element_t,
a_parent_name varchar2 := null,
a_hierarchy_level integer := 1,
a_access_path varchar2 := '$'
) as
l_keys json_key_list;
- 187
l_object json_object_t := treat(a_json_piece as json_object_t);
l_path varchar2(32767);
l_type varchar2(50);
l_name varchar2(4000);
begin
- 187
l_keys := coalesce(l_object.get_keys,json_key_list());
- 1335
for i in 1 .. l_keys.count loop
- 1148
l_type := get_json_type(l_object.get(l_keys(i)));
- 1148
l_name := '"'||l_keys(i)||'"';
- 1148
l_path := a_access_path||'.'||l_name;
- 1148
add_json_leaf(
l_name,
get_json_value(l_object,l_keys(i)),
a_parent_name,
l_path,
a_hierarchy_level,
i,
l_type,
'object',
0,
a_access_path
);
- 1148
case l_type
- 1148
when 'array' then
- 112
traverse_array (
treat (l_object.get (l_keys(i)) as json_array_t),
l_name,
a_hierarchy_level + 1,
l_path
);
- 1036
when 'object' then
- 17
traverse_object(
treat (l_object.get (l_keys(i)) as json_object_t),
l_name,
a_hierarchy_level+1,
l_path
);
else
- 1019
null;
end case;
end loop;
end traverse_object;
member procedure traverse_array(
self in out nocopy ut_json_tree_details,
a_json_piece json_element_t,
a_parent_name varchar2 := null,
a_hierarchy_level integer := 1,
a_access_path varchar2 := '$'
) as
l_array json_array_t;
l_type varchar2(50);
l_name varchar2(4000);
l_path varchar2(32767);
begin
- 125
l_array := treat(a_json_piece as json_array_t);
- 631
for i in 0 .. l_array.get_size - 1 loop
- 506
l_type := get_json_type(l_array.get(i));
- 506
l_name := case when l_type = 'object' then l_type else l_array.get(i).stringify end;
- 506
l_path := a_access_path||'['||i||']';
- 506
add_json_leaf(
l_name,
get_json_value(a_json_piece,i),
a_parent_name,
l_path,
a_hierarchy_level,
i,
l_type,
'array',
1,
l_path
);
- 506
case l_type
- 506
when 'array' then
traverse_array (
treat (l_array.get (i) as json_array_t),
l_name,
a_hierarchy_level + 1,
l_path
);
- 506
when 'object' then
- 152
traverse_object(
treat (l_array.get (i) as json_object_t),
l_name,
a_hierarchy_level + 1,
l_path
);
else
- 354
null;
end case;
end loop;
end traverse_array;
member procedure init(self in out nocopy ut_json_tree_details,a_json_doc in json_element_t, a_level_in integer := 0) is
begin
- 31
if a_json_doc.is_object then
- 18
traverse_object(treat (a_json_doc as json_object_t));
- 13
elsif a_json_doc.is_array then
- 13
traverse_array(treat (a_json_doc as json_array_t));
end if;
end;
constructor function ut_json_tree_details(
self in out nocopy ut_json_tree_details, a_json_doc in json_element_t, a_level_in integer := 0
) return self as result is
begin
- 33
self.json_tree_info := ut_json_leaf_tab();
- 33
if a_json_doc is not null then
- 31
init(a_json_doc,a_level_in);
end if;
- 33
return;
end;
end;
UT3.UT_KEY_ANYVALUES
42.11 % lines covered
19 relevant lines. 8 lines covered and 11 lines missed
type body ut_key_anyvalues as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_key_anyvalues(self in out nocopy ut_key_anyvalues) return self as result is
begin
- 225
self.self_type := $$plsql_unit;
- 225
self.pairs := ut_key_anyval_pairs();
- 225
return;
end;
member function put(a_item ut_key_anyval_pair) return ut_key_anyvalues is
- 225
l_result ut_key_anyvalues := self;
begin
- 225
l_result.pairs.extend();
- 225
l_result.pairs(l_result.pairs.last) := a_item;
- 225
return l_result;
end;
member function put(a_key varchar2, a_value anydata) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_anydata(a_value)));
end;
member function put(a_key varchar2, a_value blob) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_blob(a_value)));
end;
member function put(a_key varchar2, a_value boolean) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_boolean(a_value)));
end;
member function put(a_key varchar2, a_value clob) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_clob(a_value)));
end;
member function put(a_key varchar2, a_value date) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_date(a_value)));
end;
member function put(a_key varchar2, a_value number) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_number(a_value)));
end;
member function put(a_key varchar2, a_value timestamp_unconstrained) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_timestamp(a_value)));
end;
member function put(a_key varchar2, a_value timestamp_ltz_unconstrained) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_timestamp_ltz(a_value)));
end;
member function put(a_key varchar2, a_value timestamp_tz_unconstrained) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_timestamp_tz(a_value)));
end;
member function put(a_key varchar2, a_value varchar2) return ut_key_anyvalues is
begin
- 225
return put(ut_key_anyval_pair(a_key, ut_data_value_varchar2(a_value)));
end;
member function put(a_key varchar2, a_value yminterval_unconstrained) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_yminterval(a_value)));
end;
member function put(a_key varchar2, a_value dsinterval_unconstrained) return ut_key_anyvalues is
begin
return put(ut_key_anyval_pair(a_key, ut_data_value_dsinterval(a_value)));
end;
end;
UT3.UT_BE_BETWEEN
100 % lines covered
28 relevant lines. 28 lines covered and 0 lines missed
type body ut_be_between is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_between, a_lower_bound ut_data_value, a_upper_bound ut_data_value) is
begin
- 71
self.self_type := $$plsql_unit;
- 71
self.lower_bound := a_lower_bound;
- 71
self.upper_bound := a_upper_bound;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound date, a_upper_bound date)
return self as result is
begin
- 8
init(ut_data_value_date(a_lower_bound), ut_data_value_date(a_upper_bound));
- 8
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound number, a_upper_bound number)
return self as result is
begin
- 8
init(ut_data_value_number(a_lower_bound), ut_data_value_number(a_upper_bound));
- 8
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound varchar2, a_upper_bound varchar2)
return self as result is
begin
- 9
init(ut_data_value_varchar2(a_lower_bound), ut_data_value_varchar2(a_upper_bound));
- 9
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound timestamp_unconstrained, a_upper_bound timestamp_unconstrained)
return self as result is
begin
- 10
init(ut_data_value_timestamp(a_lower_bound), ut_data_value_timestamp(a_upper_bound));
- 10
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound timestamp_tz_unconstrained, a_upper_bound timestamp_tz_unconstrained)
return self as result is
begin
- 10
init(ut_data_value_timestamp_tz(a_lower_bound), ut_data_value_timestamp_tz(a_upper_bound));
- 10
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound timestamp_ltz_unconstrained, a_upper_bound timestamp_ltz_unconstrained)
return self as result is
begin
- 10
init(ut_data_value_timestamp_ltz(a_lower_bound), ut_data_value_timestamp_ltz(a_upper_bound));
- 10
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound yminterval_unconstrained, a_upper_bound yminterval_unconstrained)
return self as result is
begin
- 8
init(ut_data_value_yminterval(a_lower_bound), ut_data_value_yminterval(a_upper_bound));
- 8
return;
end;
constructor function ut_be_between(self in out nocopy ut_be_between, a_lower_bound dsinterval_unconstrained, a_upper_bound dsinterval_unconstrained)
return self as result is
begin
- 8
init(ut_data_value_dsinterval(a_lower_bound), ut_data_value_dsinterval(a_upper_bound));
- 8
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_between, a_actual ut_data_value) return boolean is
l_lower_result boolean;
l_upper_result boolean;
l_result boolean;
begin
- 71
if self.lower_bound.data_type = a_actual.data_type then
- 70
l_lower_result := a_actual >= self.lower_bound;
- 70
l_upper_result := a_actual <= self.upper_bound;
- 70
if l_lower_result is not null and l_upper_result is not null then
- 38
l_result := l_lower_result and l_upper_result;
end if;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 71
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 35
return (self as ut_matcher).failure_message(a_actual)
|| ': '|| self.lower_bound.to_string_report(true,false)
|| ' and ' || self.upper_bound.to_string_report(a_with_object_info => false);
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 35
return (self as ut_matcher).failure_message_when_negated(a_actual)
|| ': '|| self.lower_bound.to_string_report(true,false)
|| ' and ' || self.upper_bound.to_string_report(a_with_object_info => false);
end;
end;
UT3.UT_BE_EMPTY
100 % lines covered
6 relevant lines. 6 lines covered and 0 lines missed
type body ut_be_empty as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_empty) is
begin
- 35
self.self_type := $$plsql_unit;
end;
constructor function ut_be_empty(self in out nocopy ut_be_empty) return self as result is
begin
- 35
init();
- 35
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_empty, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 35
return a_actual.is_empty();
exception
- 12
when value_error then
- 6
return (self as ut_matcher).run_matcher(a_actual);
end;
end;
UT3.UT_BE_FALSE
100 % lines covered
6 relevant lines. 6 lines covered and 0 lines missed
type body ut_be_false as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_be_false(self in out nocopy ut_be_false) return self as result is
begin
- 8
self.self_type := $$plsql_unit;
- 8
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_false, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 8
if a_actual is of (ut_data_value_boolean) then
- 6
l_result := not ut_utils.int_to_boolean(treat(a_actual as ut_data_value_boolean).data_value);
else
- 2
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 8
return l_result;
end;
end;
UT3.UT_BE_GREATER_OR_EQUAL
100 % lines covered
22 relevant lines. 22 lines covered and 0 lines missed
type body ut_be_greater_or_equal AS
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_greater_or_equal, a_expected ut_data_value) is
begin
- 29
self.self_type := $$plsql_unit;
- 29
self.expected := a_expected;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected date) return self as result is
begin
- 4
init(ut_data_value_date(a_expected));
- 4
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected NUMBER) return self as result is
begin
- 5
init(ut_data_value_number(a_expected));
- 5
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected timestamp_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp(a_expected));
- 4
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected timestamp_tz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_tz(a_expected));
- 4
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected timestamp_ltz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_ltz(a_expected));
- 4
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected yminterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_yminterval(a_expected));
- 4
return;
end;
constructor function ut_be_greater_or_equal(self in out nocopy ut_be_greater_or_equal, a_expected dsinterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_dsinterval(a_expected));
- 4
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_greater_or_equal, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 29
if self.expected.data_type = a_actual.data_type then
- 28
l_result := a_actual >= self.expected;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 29
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 21
return (self as ut_matcher).failure_message(a_actual) || ': '|| expected.to_string_report();
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 7
return (self as ut_matcher).failure_message_when_negated(a_actual) || ': '|| expected.to_string_report();
end;
end;
UT3.UT_BE_GREATER_THAN
100 % lines covered
22 relevant lines. 22 lines covered and 0 lines missed
type body ut_be_greater_than AS
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_greater_than, a_expected ut_data_value) is
begin
- 30
self.self_type := $$plsql_unit;
- 30
self.expected := a_expected;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected date) return self as result is
begin
- 4
init(ut_data_value_date(a_expected));
- 4
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected NUMBER) return self as result is
begin
- 6
init(ut_data_value_number(a_expected));
- 6
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected timestamp_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp(a_expected));
- 4
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected timestamp_tz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_tz(a_expected));
- 4
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected timestamp_ltz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_ltz(a_expected));
- 4
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected yminterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_yminterval(a_expected));
- 4
return;
end;
constructor function ut_be_greater_than(self in out nocopy ut_be_greater_than, a_expected dsinterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_dsinterval(a_expected));
- 4
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_greater_than, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 30
if self.expected.data_type = a_actual.data_type then
- 29
l_result := a_actual > self.expected;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 30
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 22
return (self as ut_matcher).failure_message(a_actual) || ': '|| expected.to_string_report();
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 7
return (self as ut_matcher).failure_message_when_negated(a_actual) || ': '|| expected.to_string_report();
end;
end;
UT3.UT_BE_LESS_OR_EQUAL
100 % lines covered
22 relevant lines. 22 lines covered and 0 lines missed
type body ut_be_less_or_equal AS
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_less_or_equal, a_expected ut_data_value) is
begin
- 29
self.self_type := $$plsql_unit;
- 29
self.expected := a_expected;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected date) return self as result is
begin
- 4
init(ut_data_value_date(a_expected));
- 4
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected NUMBER) return self as result is
begin
- 5
init(ut_data_value_number(a_expected));
- 5
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected timestamp_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp(a_expected));
- 4
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected timestamp_tz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_tz(a_expected));
- 4
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected timestamp_ltz_unconstrained) return self as result is
begin
- 4
init(ut_data_value_timestamp_ltz(a_expected));
- 4
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected yminterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_yminterval(a_expected));
- 4
return;
end;
constructor function ut_be_less_or_equal(self in out nocopy ut_be_less_or_equal, a_expected dsinterval_unconstrained) return self as RESULT IS
begin
- 4
init(ut_data_value_dsinterval(a_expected));
- 4
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_less_or_equal, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 29
if self.expected.data_type = a_actual.data_type then
- 28
l_result := a_actual <= self.expected;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 29
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 21
return (self as ut_matcher).failure_message(a_actual) || ': '|| expected.to_string_report();
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 7
return (self as ut_matcher).failure_message_when_negated(a_actual) || ': '|| expected.to_string_report();
end;
end;
UT3.UT_BE_LESS_THAN
100 % lines covered
22 relevant lines. 22 lines covered and 0 lines missed
type body ut_be_less_than as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_be_less_than, a_expected ut_data_value) is
begin
- 29
self.self_type := $$plsql_unit;
- 29
self.expected := a_expected;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected date) return self as result is
begin
- 4
init(ut_data_value_date(a_expected));
- 4
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected number) return self as result is
begin
- 5
init(ut_data_value_number(a_expected));
- 5
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected timestamp_unconstrained)
return self as result is
begin
- 4
init(ut_data_value_timestamp(a_expected));
- 4
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected timestamp_tz_unconstrained)
return self as result is
begin
- 4
init(ut_data_value_timestamp_tz(a_expected));
- 4
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected timestamp_ltz_unconstrained)
return self as result is
begin
- 4
init(ut_data_value_timestamp_ltz(a_expected));
- 4
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected yminterval_unconstrained)
return self as result is
begin
- 4
init(ut_data_value_yminterval(a_expected));
- 4
return;
end;
constructor function ut_be_less_than(self in out nocopy ut_be_less_than, a_expected dsinterval_unconstrained)
return self as result is
begin
- 4
init(ut_data_value_dsinterval(a_expected));
- 4
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_less_than, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 29
if self.expected.data_type = a_actual.data_type then
- 28
l_result := a_actual < self.expected;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 29
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 21
return (self as ut_matcher).failure_message(a_actual) || ': '|| expected.to_string_report();
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 7
return (self as ut_matcher).failure_message_when_negated(a_actual) || ': '|| expected.to_string_report();
end;
end;
UT3.UT_BE_LIKE
100 % lines covered
23 relevant lines. 23 lines covered and 0 lines missed
type body ut_be_like as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_be_like(self in out nocopy ut_be_like, a_mask in varchar2, a_escape_char in varchar2 := null) return self as result is
begin
- 17
self.self_type := $$plsql_unit;
- 17
self.mask := a_mask;
- 17
self.escape_char := a_escape_char;
- 17
return;
end ut_be_like;
overriding member function run_matcher(self in out nocopy ut_be_like, a_actual ut_data_value) return boolean is
l_value clob;
l_result boolean;
begin
- 17
if a_actual is of (ut_data_value_varchar2, ut_data_value_clob) then
- 16
if a_actual is of (ut_data_value_varchar2) then
- 8
l_value := treat(a_actual as ut_data_value_varchar2).data_value;
else
- 8
l_value := treat(a_actual as ut_data_value_clob).data_value;
end if;
- 16
if escape_char is not null then
- 8
l_result := l_value like mask escape escape_char;
else
- 8
l_result := l_value like mask;
end if;
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 17
return l_result;
end run_matcher;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 8
l_result := (self as ut_matcher).failure_message(a_actual);
- 8
if self.escape_char is not null then
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.mask).to_string_report(true, false) || ', escape ''' || self.escape_char ||'''';
else
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.mask).to_string_report(false, false);
end if;
- 8
return l_result;
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 8
l_result := (self as ut_matcher).failure_message_when_negated(a_actual);
- 8
if self.escape_char is not null then
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.mask).to_string_report(true, false) || ', escape ''' || self.escape_char ||'''';
else
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.mask).to_string_report(false, false);
end if;
- 8
return l_result;
end;
end;
UT3.UT_BE_NOT_NULL
100 % lines covered
3 relevant lines. 3 lines covered and 0 lines missed
type body ut_be_not_null as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_be_not_null(self in out nocopy ut_be_not_null) return self as result is
begin
- 30
self.self_type := $$plsql_unit;
- 30
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_not_null, a_actual ut_data_value) return boolean is
begin
- 30
return not a_actual.is_null;
end;
end;
UT3.UT_BE_NULL
100 % lines covered
3 relevant lines. 3 lines covered and 0 lines missed
type body ut_be_null as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_be_null(self in out nocopy ut_be_null) return self as result is
begin
- 72
self.self_type := $$plsql_unit;
- 72
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_null, a_actual ut_data_value) return boolean is
begin
- 72
return a_actual.is_null;
end;
end;
UT3.UT_BE_TRUE
100 % lines covered
6 relevant lines. 6 lines covered and 0 lines missed
type body ut_be_true as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_be_true(self in out nocopy ut_be_true) return self as result is
begin
- 8
self.self_type := $$plsql_unit;
- 8
return;
end;
overriding member function run_matcher(self in out nocopy ut_be_true, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 8
if a_actual is of (ut_data_value_boolean) then
- 6
l_result := ut_utils.int_to_boolean( treat(a_actual as ut_data_value_boolean).data_value);
else
- 2
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 8
return l_result;
end;
end;
UT3.UT_COMPARISON_MATCHER
100 % lines covered
3 relevant lines. 3 lines covered and 0 lines missed
type body ut_comparison_matcher as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
overriding member function error_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 512
if ut_utils.int_to_boolean(self.is_errored) then
- 43
l_result := 'Actual ('||a_actual.data_type||') cannot be compared to Expected ('||expected.data_type||') using matcher '''||self.name()||'''.';
end if;
- 512
return l_result;
end;
end;
UT3.UT_CONTAIN
87.5 % lines covered
16 relevant lines. 14 lines covered and 2 lines missed
type body ut_contain as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_contain(self in out nocopy ut_contain, a_expected sys_refcursor) return self as result is
begin
- 18
self.init(ut_data_value_refcursor(a_expected), null, $$plsql_unit);
- 18
self.options.unordered();
- 18
return;
end;
constructor function ut_contain(self in out nocopy ut_contain, a_expected anydata) return self as result is
begin
- 2
self.init(ut_data_value_anydata(a_expected), null, $$plsql_unit);
- 2
self.options.unordered();
- 2
return;
end;
overriding member function run_matcher(self in out nocopy ut_contain, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 20
if self.expected.data_type = a_actual.data_type then
- 20
l_result :=
( 0
= treat( self.expected as ut_data_value_refcursor )
.compare_implementation( a_actual, self.options, true, self.is_negated() )
);
else
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 20
return l_result;
end;
overriding member function run_matcher_negated(self in out nocopy ut_contain, a_actual ut_data_value) return boolean is
begin
- 5
return run_matcher(a_actual);
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 15
if self.expected.data_type = a_actual.data_type and self.expected.is_diffable then
- 15
l_result :=
'Actual: '||a_actual.get_object_info()||self.description()||': '||self.expected.get_object_info()
|| treat(expected as ut_data_value_refcursor).diff( a_actual, self.options );
else
l_result := (self as ut_matcher).failure_message(a_actual) || ': '|| self.expected.to_string_report();
end if;
- 15
return l_result;
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 5
return (self as ut_matcher).failure_message_when_negated(a_actual) || ':'|| expected.to_string_report();
end;
end;
UT3.UT_EQUAL
91.4 % lines covered
93 relevant lines. 85 lines covered and 8 lines missed
type body ut_equal as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure init(self in out nocopy ut_equal, a_expected ut_data_value, a_nulls_are_equal boolean, a_self_type varchar2 := null) is
begin
- 395
self.expected := a_expected;
- 395
self.options := ut_matcher_options( a_nulls_are_equal );
- 395
self.self_type := nvl( a_self_type, $$plsql_unit );
end;
member function equal_with_nulls(a_assert_result boolean, a_actual ut_data_value) return boolean is
begin
- 511
ut_utils.debug_log('ut_equal.equal_with_nulls :' || ut_utils.to_test_result(a_assert_result) || ':');
- 511
return ( a_assert_result or ( self.expected.is_null() and a_actual.is_null() and options.nulls_are_equal ) );
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected anydata, a_nulls_are_equal boolean := null) return self as result is
begin
- 60
init(ut_data_value_anydata(a_expected), a_nulls_are_equal);
- 60
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected anydata, a_exclude varchar2, a_nulls_are_equal boolean := null) return self as result is
l_deprecated integer;
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'equal( a_expected anydata, a_exclude varchar2 )',
'equal( a_expected anydata ).exclude( a_exclude varchar2 )'
);
- 1
init(ut_data_value_anydata(a_expected), a_nulls_are_equal);
- 1
self.options.exclude.add_items(a_exclude);
- 1
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected anydata, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) return self as result is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'equal( a_expected anydata, a_exclude ut_varchar2_list )',
'equal( a_expected anydata ).exclude( a_exclude ut_varchar2_list )'
);
- 1
init(ut_data_value_anydata(a_expected), a_nulls_are_equal);
- 1
self.options.exclude.add_items(a_exclude);
- 1
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected blob, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_blob(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected boolean, a_nulls_are_equal boolean := null) return self as result is
begin
- 13
init(ut_data_value_boolean(a_expected), a_nulls_are_equal);
- 13
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected clob, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_clob(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected date, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_date(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected number, a_nulls_are_equal boolean := null) return self as result is
begin
- 75
init(ut_data_value_number(a_expected), a_nulls_are_equal);
- 75
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected sys_refcursor, a_nulls_are_equal boolean := null) return self as result is
begin
- 108
init(ut_data_value_refcursor(a_expected), a_nulls_are_equal);
- 106
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected sys_refcursor, a_exclude varchar2, a_nulls_are_equal boolean := null) return self as result is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'equal( a_expected sys_refcursor, a_exclude varchar2 )',
'equal( a_expected sys_refcursor ).exclude( a_exclude varchar2 )'
);
- 1
init(ut_data_value_refcursor(a_expected), a_nulls_are_equal);
- 1
self.options.exclude.add_items(a_exclude);
- 1
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected sys_refcursor, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) return self as result is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'equal( a_expected sys_refcursor, a_exclude ut_varchar2_list )',
'equal( a_expected sys_refcursor ).exclude( a_exclude ut_varchar2_list )'
);
- 1
init(ut_data_value_refcursor(a_expected), a_nulls_are_equal);
- 1
self.options.exclude.add_items(a_exclude);
- 1
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected timestamp_unconstrained, a_nulls_are_equal boolean := null) return self as result is
begin
- 12
init(ut_data_value_timestamp(a_expected), a_nulls_are_equal);
- 12
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected timestamp_tz_unconstrained, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_timestamp_tz(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected timestamp_ltz_unconstrained, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_timestamp_ltz(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected varchar2, a_nulls_are_equal boolean := null) return self as result is
begin
- 25
init(ut_data_value_varchar2(a_expected), a_nulls_are_equal);
- 25
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_yminterval(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_dsinterval(a_expected), a_nulls_are_equal);
- 10
return;
end;
constructor function ut_equal(self in out nocopy ut_equal, a_expected json_element_t, a_nulls_are_equal boolean := null) return self as result is
begin
- 10
init(ut_data_value_json(a_expected), a_nulls_are_equal);
- 10
return;
end;
member function include(a_items varchar2) return ut_equal is
l_result ut_equal := self;
begin
l_result.options.include.add_items(a_items);
return l_result;
end;
member function include(a_items ut_varchar2_list) return ut_equal is
- 22
l_result ut_equal := self;
begin
- 22
l_result.options.include.add_items(a_items);
- 22
return l_result;
end;
member function exclude(a_items varchar2) return ut_equal is
- 11
l_result ut_equal := self;
begin
- 11
l_result.options.exclude.add_items(a_items);
- 11
return l_result;
end;
member function exclude(a_items ut_varchar2_list) return ut_equal is
- 23
l_result ut_equal := self;
begin
- 23
l_result.options.exclude.add_items(a_items);
- 23
return l_result;
end;
member function unordered return ut_equal is
- 15
l_result ut_equal := self;
begin
- 15
l_result.options.unordered();
- 15
return l_result;
end;
member function join_by(a_columns varchar2) return ut_equal is
l_result ut_equal := self;
begin
l_result.options.unordered();
l_result.options.join_by.add_items(a_columns);
return l_result;
end;
member function join_by(a_columns ut_varchar2_list) return ut_equal is
- 42
l_result ut_equal := self;
begin
- 42
l_result.options.unordered();
- 42
l_result.options.join_by.add_items(a_columns);
- 42
return l_result;
end;
member function uc return ut_equal is
begin
return unordered_columns;
end;
member function unordered_columns return ut_equal is
- 10
l_result ut_equal := self;
begin
- 10
l_result.options.unordered_columns();
- 10
return l_result;
end;
overriding member function run_matcher(self in out nocopy ut_equal, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 375
if self.expected.data_type = a_actual.data_type then
- 336
if self.expected is of (ut_data_value_anydata) then
- 55
l_result := 0 = treat(self.expected as ut_data_value_anydata).compare_implementation( a_actual, options );
- 281
elsif self.expected is of (ut_data_value_refcursor) then
- 106
l_result := 0 = treat(self.expected as ut_data_value_refcursor).compare_implementation( a_actual, options );
else
- 175
l_result := equal_with_nulls((self.expected = a_actual), a_actual);
end if;
- 336
l_result := equal_with_nulls( l_result, a_actual );
else
- 39
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 375
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 329
if self.expected.data_type = a_actual.data_type and self.expected.is_diffable then
- 164
l_result :=
'Actual: '||a_actual.get_object_info()||self.description()||': '||self.expected.get_object_info()
- 1
||case
- 1
when self.expected is of (ut_data_value_refcursor) then
treat(expected as ut_data_value_refcursor).diff( a_actual, options )
- 1
when self.expected is of (ut_data_value_json) then
treat(expected as ut_data_value_json).diff( a_actual, options )
else
expected.diff( a_actual, options )
end;
else
- 165
l_result := (self as ut_matcher).failure_message(a_actual) || ': '|| self.expected.to_string_report();
end if;
- 329
return l_result;
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 7
return (self as ut_matcher).failure_message_when_negated(a_actual) || ': '|| expected.to_string_report();
end;
end;
UT3.UT_HAVE_COUNT
100 % lines covered
11 relevant lines. 11 lines covered and 0 lines missed
type body ut_have_count as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_have_count(self in out nocopy ut_have_count, a_expected integer) return self as result is
begin
- 25
self.self_type := $$plsql_unit;
- 25
self.expected := a_expected;
- 25
return;
end;
overriding member function run_matcher(self in out nocopy ut_have_count, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 25
if a_actual is of(ut_data_value_refcursor) and ( treat (a_actual as ut_data_value_refcursor).compound_type != 'object') then
- 14
l_result := ( self.expected = treat(a_actual as ut_data_value_refcursor).elements_count );
- 11
elsif a_actual is of(ut_data_value_json) then
- 5
l_result := ( self.expected = treat(a_actual as ut_data_value_json).get_elements_count );
else
- 6
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 25
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 12
return 'Actual: (' || case when a_actual is of (ut_data_value_json) then
treat(a_actual as ut_data_value_json).get_json_count_info() else a_actual.get_object_info() end||
') was expected to have [ count = '||ut_utils.to_string(self.expected)||' ]';
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 7
return 'Actual: ' || case when a_actual is of (ut_data_value_json) then
treat(a_actual as ut_data_value_json).get_json_count_info() else a_actual.get_object_info() end||
' was expected not to have [ count = '||ut_utils.to_string(self.expected)||' ]';
end;
end;
UT3.UT_MATCH
100 % lines covered
20 relevant lines. 20 lines covered and 0 lines missed
type body ut_match as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_match(self in out nocopy ut_match, a_pattern in varchar2, a_modifiers in varchar2 default null) return self as result is
begin
- 17
self.self_type := $$plsql_unit;
- 17
self.pattern := a_pattern;
- 17
self.modifiers := a_modifiers;
- 17
return;
end;
overriding member function run_matcher(self in out nocopy ut_match, a_actual ut_data_value) return boolean is
l_result boolean;
begin
- 17
if a_actual is of (ut_data_value_varchar2) then
- 8
l_result := regexp_like(treat(a_actual as ut_data_value_varchar2).data_value, pattern, modifiers);
- 9
elsif a_actual is of (ut_data_value_clob) then
- 8
l_result := regexp_like(treat(a_actual as ut_data_value_clob).data_value, pattern, modifiers);
else
- 1
l_result := (self as ut_matcher).run_matcher(a_actual);
end if;
- 17
return l_result;
end;
overriding member function failure_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 8
l_result := (self as ut_matcher).failure_message(a_actual);
- 8
if self.modifiers is not null then
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.pattern).to_string_report(true, false) || ', modifiers ''' || self.modifiers ||'''';
else
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.pattern).to_string_report(false, false);
end if;
- 8
return l_result;
end;
overriding member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 8
l_result := (self as ut_matcher).failure_message_when_negated(a_actual);
- 8
if self.modifiers is not null then
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.pattern).to_string_report(true, false) || ', modifiers ''' || self.modifiers ||'''';
else
- 4
l_result := l_result || ': '|| ut_data_value_varchar2(self.pattern).to_string_report(false, false);
end if;
- 8
return l_result;
end;
end;
UT3.UT_MATCHER
100 % lines covered
17 relevant lines. 17 lines covered and 0 lines missed
type body ut_matcher as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member function run_matcher(self in out nocopy ut_matcher, a_actual ut_data_value) return boolean is
begin
- 62
ut_utils.debug_log('Failure - ut_matcher.run_matcher'||'(a_actual '||a_actual.data_type||')');
- 62
self.is_errored := ut_utils.boolean_to_int(true);
-- self.error_message := 'The matcher '''||name()||''' cannot be used';
-- if self.expected is not null then
-- self.error_message := self.error_message ||' for comparison of data type ('||self.expected.data_type||')';
-- end if;
-- self.error_message := self.error_message ||' with data type ('||a_actual.data_type||').';
- 62
return null;
end;
member function run_matcher_negated(self in out nocopy ut_matcher, a_actual ut_data_value) return boolean is
begin
- 169
return not run_matcher(a_actual);
end;
member function name return varchar2 is
begin
- 776
return replace(ltrim(lower(self.self_type),'ut_'),'_',' ');
end;
member function description return varchar2 is
begin
- 573
return ' was expected to '||name();
end;
member function description_when_negated return varchar2 is
begin
- 141
return ' was expected not to '||name();
end;
member function error_message(a_actual ut_data_value) return varchar2 is
l_result varchar2(32767);
begin
- 283
if ut_utils.int_to_boolean(self.is_errored) then
- 19
l_result := 'The matcher '''||name()||''' cannot be used with data type ('||a_actual.data_type||').';
end if;
- 283
return l_result;
end;
member function failure_message(a_actual ut_data_value) return varchar2 is
begin
- 394
return 'Actual: ' || a_actual.to_string_report(true) || description();
end;
member function failure_message_when_negated(a_actual ut_data_value) return varchar2 is
begin
- 141
return 'Actual: ' || a_actual.to_string_report(true) || description_when_negated();
end;
member procedure negated is
begin
- 6
is_negated_flag := ut_utils.boolean_to_int(true);
end;
member function negated return ut_matcher is
- 6
l_result ut_matcher := self;
begin
- 6
l_result.negated();
- 6
return l_result;
end;
member function is_negated return boolean is
begin
- 645
return coalesce(ut_utils.int_to_boolean(is_negated_flag), false);
end;
end;
UT3.UT_MATCHER_OPTIONS
92.31 % lines covered
13 relevant lines. 12 lines covered and 1 lines missed
type body ut_matcher_options as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_matcher_options(self in out nocopy ut_matcher_options, a_nulls_are_equal in boolean := null) return self as result is
begin
- 395
nulls_are_equal_flag := ut_utils.boolean_to_int( coalesce(a_nulls_are_equal, ut_expectation_processor.nulls_are_equal()) );
- 395
is_unordered := ut_utils.boolean_to_int(false);
- 395
columns_are_unordered_flag := ut_utils.boolean_to_int(false);
- 395
include := ut_matcher_options_items();
- 395
exclude := ut_matcher_options_items();
- 395
join_by := ut_matcher_options_items();
- 395
return;
end;
member procedure nulls_are_equal(self in out nocopy ut_matcher_options) is
begin
self.nulls_are_equal_flag := ut_utils.boolean_to_int(true);
end;
member function nulls_are_equal return boolean is
begin
- 66
return ut_utils.int_to_boolean(self.nulls_are_equal_flag);
end;
member procedure unordered_columns(self in out nocopy ut_matcher_options) is
begin
- 10
columns_are_unordered_flag := ut_utils.boolean_to_int(true);
end;
member function ordered_columns return boolean is
begin
- 213
return not ut_utils.int_to_boolean(columns_are_unordered_flag);
end;
member procedure unordered(self in out nocopy ut_matcher_options) is
begin
- 77
is_unordered := ut_utils.boolean_to_int(true);
end;
member function unordered return boolean is
begin
- 452
return ut_utils.int_to_boolean(is_unordered);
end;
end;
UT3.UT_MATCHER_OPTIONS_ITEMS
88.89 % lines covered
9 relevant lines. 8 lines covered and 1 lines missed
type body ut_matcher_options_items is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_matcher_options_items(self in out nocopy ut_matcher_options_items) return self as result is
begin
- 1185
items := ut_varchar2_list();
- 1185
return;
end;
member procedure add_items(self in out nocopy ut_matcher_options_items, a_items varchar2) is
begin
- 136
items :=
items
multiset union all
ut_utils.filter_list(
ut_utils.trim_list_elements(
ut_utils.string_to_table( replace( a_items , '|', ',' ), ',' )
)
, '.+'
);
end;
member procedure add_items(self in out nocopy ut_matcher_options_items, a_items ut_varchar2_list) is
l_idx binary_integer;
begin
- 89
if a_items is not null then
- 89
l_idx := a_items.first;
- 212
while l_idx is not null loop
- 123
add_items( a_items(l_idx) );
- 123
l_idx := a_items.next(l_idx);
end loop;
end if;
end;
member function to_xpath return varchar2 is
begin
return ut_utils.to_xpath(items);
end;
end;
UT3.UT_EXPECTATION
98.62 % lines covered
145 relevant lines. 143 lines covered and 2 lines missed
type body ut_expectation as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
member procedure to_(self in ut_expectation, a_matcher ut_matcher) is
l_expectation_result boolean;
- 625
l_matcher ut_matcher := a_matcher;
l_message varchar2(32767);
begin
- 625
if a_matcher.is_negated() then
- 4
self.not_to( a_matcher );
else
- 621
l_expectation_result := l_matcher.run_matcher( self.actual_data );
- 621
l_expectation_result := coalesce(l_expectation_result,false);
- 621
l_message := coalesce( l_matcher.error_message( self.actual_data ), l_matcher.failure_message( self.actual_data ) );
- 621
ut_expectation_processor.add_expectation_result( ut_expectation_result( ut_utils.to_test_result( l_expectation_result ), self.description, l_message ) );
end if;
end;
member procedure not_to(self in ut_expectation, a_matcher ut_matcher) is
l_expectation_result boolean;
- 174
l_matcher ut_matcher := a_matcher;
l_message varchar2(32767);
begin
- 174
l_expectation_result := coalesce( l_matcher.run_matcher_negated( self.actual_data ), false );
- 174
l_message := coalesce( l_matcher.error_message( self.actual_data ), l_matcher.failure_message_when_negated( self.actual_data ) );
- 174
ut_expectation_processor.add_expectation_result( ut_expectation_result( ut_utils.to_test_result( l_expectation_result ), self.description, l_message ) );
end;
member procedure to_be_null(self in ut_expectation) is
begin
- 42
self.to_( ut_be_null() );
end;
member procedure to_be_not_null(self in ut_expectation) is
begin
- 29
self.to_( ut_be_not_null() );
end;
member procedure not_to_be_null(self in ut_expectation) is
begin
- 30
self.not_to( ut_be_null() );
end;
member procedure not_to_be_not_null(self in ut_expectation) is
begin
- 1
self.not_to( ut_be_not_null() );
end;
member procedure to_be_true(self in ut_expectation) is
begin
- 4
self.to_( ut_be_true() );
end;
member procedure to_be_false(self in ut_expectation) is
begin
- 4
self.to_( ut_be_false() );
end;
member procedure not_to_be_true(self in ut_expectation) is
begin
- 4
self.not_to( ut_be_true() );
end;
member procedure not_to_be_false(self in ut_expectation) is
begin
- 4
self.not_to( ut_be_false() );
end;
member procedure to_be_empty(self in ut_expectation) is
begin
- 14
self.to_( ut_be_empty() );
end;
member procedure not_to_be_empty(self in ut_expectation) is
begin
- 11
self.not_to( ut_be_empty() );
end;
member procedure to_equal(self in ut_expectation, a_expected anydata, a_nulls_are_equal boolean := null) is
begin
- 32
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected anydata, a_exclude varchar2, a_nulls_are_equal boolean := null) is
begin
- 4
ut_expectation_processor.add_warning(
ut_utils.build_depreciation_warning(
'to_equal( a_expected anydata, a_exclude varchar2 )',
'to_equal( a_expected anydata ).exclude( a_exclude varchar2 )'
)
);
- 4
self.to_( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure to_equal(self in ut_expectation, a_expected anydata, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) is
begin
- 2
ut_expectation_processor.add_warning(
ut_utils.build_depreciation_warning(
'to_equal( a_expected anydata, a_exclude ut_varchar2_list )',
'to_equal( a_expected anydata ).exclude( a_exclude ut_varchar2_list )'
)
);
- 2
self.to_( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure to_equal(self in ut_expectation, a_expected blob, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected boolean, a_nulls_are_equal boolean := null) is
begin
- 11
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected clob, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected date, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected number, a_nulls_are_equal boolean := null) is
begin
- 73
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected sys_refcursor, a_nulls_are_equal boolean := null) is
begin
- 38
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected sys_refcursor, a_exclude varchar2, a_nulls_are_equal boolean := null) is
begin
- 5
ut_expectation_processor.add_depreciation_warning(
'to_equal( a_expected sys_refcursor, a_exclude varchar2 )',
'to_equal( a_expected sys_refcursor ).exclude( a_exclude varchar2 )'
);
- 5
self.to_( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure to_equal(self in ut_expectation, a_expected sys_refcursor, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) is
begin
- 4
ut_expectation_processor.add_depreciation_warning(
'to_equal( a_expected sys_refcursor, a_exclude ut_varchar2_list )',
'to_equal( a_expected sys_refcursor ).exclude( a_exclude ut_varchar2_list )'
);
- 4
self.to_( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure to_equal(self in ut_expectation, a_expected timestamp_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 10
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected varchar2, a_nulls_are_equal boolean := null) is
begin
- 23
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 9
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_equal(self in ut_expectation, a_expected json_element_t, a_nulls_are_equal boolean := null) is
begin
- 10
self.to_( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected anydata, a_nulls_are_equal boolean := null) is
begin
- 3
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected anydata, a_exclude varchar2, a_nulls_are_equal boolean := null) is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'not_to_equal( a_expected anydata, a_exclude varchar2 )',
'not_to_equal( a_expected anydata ).exclude( a_exclude varchar2 )'
);
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected anydata, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'not_to_equal( a_expected anydata, a_exclude ut_varchar2_list )',
'not_to_equal( a_expected anydata ).exclude( a_exclude ut_varchar2_list )'
);
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected blob, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected boolean, a_nulls_are_equal boolean := null) is
begin
- 2
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected clob, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected date, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected number, a_nulls_are_equal boolean := null) is
begin
- 2
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected sys_refcursor, a_nulls_are_equal boolean := null) is
begin
- 2
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected sys_refcursor, a_exclude varchar2, a_nulls_are_equal boolean := null) is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'not_to_equal( a_expected sys_refcursor, a_exclude varchar2 )',
'not_to_equal( a_expected sys_refcursor ).exclude( a_exclude varchar2 )'
);
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected sys_refcursor, a_exclude ut_varchar2_list, a_nulls_are_equal boolean := null) is
begin
- 1
ut_expectation_processor.add_depreciation_warning(
'not_to_equal( a_expected sys_refcursor, a_exclude ut_varchar2_list )',
'not_to_equal( a_expected sys_refcursor ).exclude( a_exclude ut_varchar2_list )'
);
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal).exclude(a_exclude) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected timestamp_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 2
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected varchar2, a_nulls_are_equal boolean := null) is
begin
- 2
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null) is
begin
- 1
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure not_to_equal(self in ut_expectation, a_expected json_element_t, a_nulls_are_equal boolean := null) is
begin
self.not_to( ut_equal(a_expected, a_nulls_are_equal) );
end;
member procedure to_be_like(self in ut_expectation, a_mask in varchar2, a_escape_char in varchar2 := null) is
begin
- 9
self.to_( ut_be_like(a_mask, a_escape_char) );
end;
member procedure to_match(self in ut_expectation, a_pattern in varchar2, a_modifiers in varchar2 default null) is
begin
- 9
self.to_( ut_match(a_pattern, a_modifiers) );
end;
member procedure not_to_be_like(self in ut_expectation, a_mask in varchar2, a_escape_char in varchar2 := null) is
begin
- 8
self.not_to( ut_be_like(a_mask, a_escape_char) );
end;
member procedure not_to_match(self in ut_expectation, a_pattern in varchar2, a_modifiers in varchar2 default null) is
begin
- 8
self.not_to( ut_match(a_pattern, a_modifiers) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound date, a_upper_bound date) is
begin
- 4
self.to_( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound dsinterval_unconstrained, a_upper_bound dsinterval_unconstrained) is
begin
- 4
self.to_( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound number, a_upper_bound number) is
begin
- 4
self.to_( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound timestamp_unconstrained, a_upper_bound timestamp_unconstrained) is
begin
- 5
self.to_( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound timestamp_ltz_unconstrained, a_upper_bound timestamp_ltz_unconstrained) is
begin
- 5
self.to_( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound timestamp_tz_unconstrained, a_upper_bound timestamp_tz_unconstrained) is
begin
- 5
self.to_( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound varchar2, a_upper_bound varchar2) is
begin
- 5
self.to_( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure to_be_between(self in ut_expectation, a_lower_bound yminterval_unconstrained, a_upper_bound yminterval_unconstrained) is
begin
- 4
self.to_( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected date) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected number) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_or_equal(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 3
self.to_( ut_be_greater_or_equal (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected date) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected number) is
begin
- 4
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_greater_than(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 3
self.to_( ut_be_greater_than (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected date) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected number) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_or_equal(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 3
self.to_( ut_be_less_or_equal (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected date) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected number) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure to_be_less_than(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 3
self.to_( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound date, a_upper_bound date) is
begin
- 4
self.not_to( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound dsinterval_unconstrained, a_upper_bound dsinterval_unconstrained) is
begin
- 4
self.not_to( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound number, a_upper_bound number) is
begin
- 4
self.not_to( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound timestamp_unconstrained, a_upper_bound timestamp_unconstrained) is
begin
- 5
self.not_to( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound timestamp_ltz_unconstrained, a_upper_bound timestamp_ltz_unconstrained) is
begin
- 5
self.not_to( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound timestamp_tz_unconstrained, a_upper_bound timestamp_tz_unconstrained) is
begin
- 5
self.not_to( ut_be_between(a_lower_bound, a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound varchar2, a_upper_bound varchar2) is
begin
- 4
self.not_to( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure not_to_be_between(self in ut_expectation, a_lower_bound yminterval_unconstrained, a_upper_bound yminterval_unconstrained) is
begin
- 4
self.not_to( ut_be_between(a_lower_bound,a_upper_bound) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected date) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected number) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_or_equal(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_or_equal (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected date) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected number) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_greater_than(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 1
self.not_to( ut_be_greater_than (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected date) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected number) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_or_equal(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 1
self.not_to( ut_be_less_or_equal (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected date) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected dsinterval_unconstrained) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected number) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected timestamp_unconstrained) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected timestamp_ltz_unconstrained) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected timestamp_tz_unconstrained) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure not_to_be_less_than(self in ut_expectation, a_expected yminterval_unconstrained) is
begin
- 1
self.not_to( ut_be_less_than (a_expected) );
end;
member procedure to_contain(self in ut_expectation, a_expected sys_refcursor) is
begin
- 5
self.to_( ut_contain(a_expected) );
end;
member procedure not_to_contain(self in ut_expectation, a_expected sys_refcursor) is
begin
- 2
self.not_to( ut_contain(a_expected).negated() );
end;
member procedure to_contain(self in ut_expectation, a_expected anydata) is
begin
- 2
self.to_( ut_contain(a_expected) );
end;
member procedure not_to_contain(self in ut_expectation, a_expected anydata) is
begin
self.not_to( ut_contain(a_expected).negated() );
end;
end;
UT3.UT_EXPECTATION_COMPOUND
77.19 % lines covered
57 relevant lines. 44 lines covered and 13 lines missed
type body ut_expectation_compound as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_expectation_compound(self in out nocopy ut_expectation_compound, a_actual_data ut_data_value, a_description varchar2) return self as result is
begin
- 259
self.actual_data := a_actual_data;
- 259
self.description := a_description;
- 259
return;
end;
member procedure to_have_count(self in ut_expectation_compound, a_expected integer) is
begin
- 11
self.to_( ut_have_count(a_expected) );
end;
member procedure not_to_have_count(self in ut_expectation_compound, a_expected integer) is
begin
- 7
self.not_to( ut_have_count(a_expected) );
end;
member function to_equal(a_expected anydata, a_nulls_are_equal boolean := null) return ut_expectation_compound is
- 16
l_result ut_expectation_compound := self;
begin
- 16
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal);
- 16
return l_result;
end;
member function not_to_equal(a_expected anydata, a_nulls_are_equal boolean := null) return ut_expectation_compound is
- 1
l_result ut_expectation_compound := self;
begin
- 1
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal).negated();
- 1
return l_result;
end;
member function to_equal(a_expected sys_refcursor, a_nulls_are_equal boolean := null) return ut_expectation_compound is
- 57
l_result ut_expectation_compound := self;
begin
- 57
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal);
- 57
return l_result;
end;
member function not_to_equal(a_expected sys_refcursor, a_nulls_are_equal boolean := null) return ut_expectation_compound is
l_result ut_expectation_compound := self;
begin
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal).negated();
return l_result;
end;
member function to_contain(a_expected sys_refcursor) return ut_expectation_compound is
- 8
l_result ut_expectation_compound := self;
begin
- 8
l_result.matcher := ut_contain(a_expected);
- 8
return l_result;
end;
member function not_to_contain(a_expected sys_refcursor) return ut_expectation_compound is
- 3
l_result ut_expectation_compound := self;
begin
- 3
l_result.matcher := ut_contain(a_expected).negated();
- 3
return l_result;
end;
member function to_contain(a_expected anydata) return ut_expectation_compound is
l_result ut_expectation_compound := self;
begin
l_result.matcher := ut_contain(a_expected);
return l_result;
end;
member function not_to_contain(a_expected anydata) return ut_expectation_compound is
l_result ut_expectation_compound := self;
begin
l_result.matcher := ut_contain(a_expected).negated();
return l_result;
end;
member function include(a_items varchar2) return ut_expectation_compound is
begin
- 1
return include( ut_varchar2_list( a_items ) );
end;
member function include(a_items ut_varchar2_list) return ut_expectation_compound is
- 6
l_result ut_expectation_compound := self;
begin
- 6
l_result.matcher := treat(l_result.matcher as ut_equal).include(a_items);
- 6
return l_result;
end;
member procedure include(self in ut_expectation_compound, a_items varchar2) is
begin
- 7
include( ut_varchar2_list( a_items ) );
end;
member procedure include(self in ut_expectation_compound, a_items ut_varchar2_list) is
begin
- 16
self.to_( treat(matcher as ut_equal).include(a_items) );
end;
member function exclude(a_items varchar2) return ut_expectation_compound is
begin
- 2
return exclude( ut_varchar2_list( a_items ) );
end;
member function exclude(a_items ut_varchar2_list) return ut_expectation_compound is
- 8
l_result ut_expectation_compound := self;
begin
- 8
l_result.matcher := treat(l_result.matcher as ut_equal).exclude(a_items);
- 8
return l_result;
end;
member procedure exclude(self in ut_expectation_compound, a_items varchar2) is
begin
- 3
exclude( ut_varchar2_list( a_items ) );
end;
member procedure exclude(self in ut_expectation_compound, a_items ut_varchar2_list) is
begin
- 7
self.to_( treat(matcher as ut_equal).exclude(a_items) );
end;
member function unordered return ut_expectation_compound is
- 1
l_result ut_expectation_compound := self;
begin
- 1
l_result.matcher := treat(l_result.matcher as ut_equal).unordered();
- 1
return l_result;
end;
member procedure unordered(self in ut_expectation_compound) is
begin
- 14
self.to_( treat(matcher as ut_equal).unordered() );
end;
member function join_by(a_columns varchar2) return ut_expectation_compound is
begin
- 3
return join_by( ut_varchar2_list( a_columns ) );
end;
member function join_by(a_columns ut_varchar2_list) return ut_expectation_compound is
l_result ut_expectation_compound;
begin
- 4
l_result := self;
- 4
l_result.matcher := treat(l_result.matcher as ut_equal).join_by(a_columns);
- 4
return l_result;
end;
member procedure join_by(self in ut_expectation_compound, a_columns varchar2) is
begin
- 31
join_by( ut_varchar2_list( a_columns ) );
end;
member procedure join_by(self in ut_expectation_compound, a_columns ut_varchar2_list) is
begin
- 38
self.to_( treat(matcher as ut_equal).join_by(a_columns) );
end;
member function unordered_columns return ut_expectation_compound is
l_result ut_expectation_compound;
begin
l_result := self;
l_result.matcher := treat(l_result.matcher as ut_equal).unordered_columns;
return l_result;
end;
member procedure unordered_columns(self in ut_expectation_compound) is
begin
- 10
self.to_( treat(matcher as ut_equal).unordered_columns );
end;
member function uc return ut_expectation_compound is
begin
return unordered_columns;
end;
member procedure uc(self in ut_expectation_compound) is
begin
- 5
unordered_columns;
end;
end;
UT3.UT_EXPECTATION_JSON
45.45 % lines covered
11 relevant lines. 5 lines covered and 6 lines missed
type body ut_expectation_json as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_expectation_json(self in out nocopy ut_expectation_json, a_actual_data ut_data_value, a_description varchar2) return self as result is
begin
- 23
self.actual_data := a_actual_data;
- 23
self.description := a_description;
- 23
return;
end;
member function to_equal(a_expected json_element_t, a_nulls_are_equal boolean := null) return ut_expectation_json is
l_result ut_expectation_json := self;
begin
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal);
return l_result;
end;
member function not_to_equal(a_expected json_element_t, a_nulls_are_equal boolean := null) return ut_expectation_json is
l_result ut_expectation_json := self;
begin
l_result.matcher := ut_equal(a_expected, a_nulls_are_equal).negated();
return l_result;
end;
member procedure to_have_count(self in ut_expectation_json, a_expected integer) is
begin
- 3
self.to_( ut_have_count(a_expected) );
end;
member procedure not_to_have_count(self in ut_expectation_json, a_expected integer) is
begin
- 2
self.not_to( ut_have_count(a_expected) );
end;
end;
UT3.UT_ANSICONSOLE_HELPER
92.86 % lines covered
14 relevant lines. 13 lines covered and 1 lines missed
package body ut_ansiconsole_helper as
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 1
gc_red constant varchar2(7) := chr(27) || '[31m';
- 1
gc_green constant varchar2(7) := chr(27) || '[32m';
- 1
gc_yellow constant varchar2(7) := chr(27) || '[33m';
- 1
gc_cyan constant varchar2(7) := chr(27) || '[36m';
- 1
gc_reset constant varchar2(7) := chr(27) || '[0m';
- 1
g_enabled boolean := false;
procedure color_enabled(a_enabled boolean) is
begin
- 116
g_enabled := a_enabled;
end;
function add_color(a_text varchar2, a_color varchar2 := gc_reset) return varchar2 is
begin
- 398
if g_enabled and a_text is not null then
return a_color||a_text||gc_reset;
else
- 398
return a_text;
end if;
end;
function red(a_text varchar2) return varchar2 is
begin
- 207
return add_color(a_text, gc_red);
end;
function green(a_text varchar2) return varchar2 is
begin
- 180
return add_color(a_text, gc_green);
end;
function yellow(a_text varchar2) return varchar2 is
begin
- 1
return add_color(a_text, gc_yellow);
end;
function cyan(a_text varchar2) return varchar2 is
begin
- 10
return add_color(a_text, gc_cyan);
end;
end;
UT3.UT_COVERAGE_COBERTURA_REPORTER
91.8 % lines covered
61 relevant lines. 56 lines covered and 5 lines missed
type body ut_coverage_cobertura_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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
- 2
self.init($$plsql_unit);
- 2
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;
- 2
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
- 2
dbms_lob.createtemporary(l_result, true);
- 2
l_line_no := a_unit_coverage.lines.first;
- 2
if l_line_no is null then
- 16
for i in 1 .. a_unit_coverage.total_lines loop
- 15
ut_utils.append_to_clob(l_result, '<line number="'||i||'" hits="0" branch="false"/>'||chr(10));
end loop;
else
- 4
while l_line_no is not null loop
- 3
if a_unit_coverage.lines(l_line_no).executions = 0 then
- 1
l_file_part := '<line number="'||l_line_no||'" hits="0" branch="false"/>'||chr(10);
else
- 2
l_file_part := '<line number="'||l_line_no||'" hits="'||a_unit_coverage.lines(l_line_no).executions||'"';
- 2
if a_unit_coverage.lines(l_line_no).covered_blocks < a_unit_coverage.lines(l_line_no).no_blocks then
l_file_part := l_file_part || ' branch="true"';
l_pct := (a_unit_coverage.lines(l_line_no).covered_blocks/a_unit_coverage.lines(l_line_no).no_blocks)*100;
l_file_part := l_file_part || ' condition-coverage="'||l_pct||'%';
l_file_part := l_file_part || ' ('||a_unit_coverage.lines(l_line_no).covered_blocks||'/'||a_unit_coverage.lines(l_line_no).no_blocks||')"';
else
- 2
l_file_part := l_file_part || ' branch="false"';
end if;
- 2
l_file_part := l_file_part ||'/>'||chr(10);
end if;
- 3
ut_utils.append_to_clob(l_result, l_file_part);
- 3
l_line_no := a_unit_coverage.lines.next(l_line_no);
end loop;
end if;
- 2
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);
- 2
l_result ut_varchar2_rows := ut_varchar2_rows();
l_unit ut_coverage.t_full_name;
l_obj_name ut_coverage.t_object_name;
- 2
c_coverage_def constant varchar2(200) := '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">';
- 2
c_file_footer constant varchar2(30) := '</file>';
- 2
c_coverage_footer constant varchar2(30) := '</coverage>';
- 2
c_sources_footer constant varchar2(30) := '</sources>';
- 2
c_packages_footer constant varchar2(30) := '</packages>';
- 2
c_package_footer constant varchar2(30) := '</package>';
- 2
c_class_footer constant varchar2(30) := '</class>';
- 2
c_lines_footer constant varchar2(30) := '</lines>';
- 2
l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
begin
- 2
ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
- 2
ut_utils.append_to_list( l_result, c_coverage_def );
--write header
- 2
ut_utils.append_to_list(
l_result,
'<coverage line-rate="0" branch-rate="0.0" lines-covered="'
||a_coverage_data.covered_lines||'" lines-valid="'
||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)
||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">'
);
--Write sources
- 2
l_unit := a_coverage_data.objects.first;
- 2
ut_utils.append_to_list( l_result, '<sources>' );
- 4
while l_unit is not null loop
- 3
ut_utils.append_to_list(l_result, '<source>'||dbms_xmlgen.convert(l_unit)||'</source>');
- 2
l_unit := a_coverage_data.objects.next(l_unit);
end loop;
- 2
ut_utils.append_to_list(l_result, c_sources_footer);
--write packages
- 2
l_unit := a_coverage_data.objects.first;
- 2
ut_utils.append_to_list(l_result, '<packages>');
- 4
while l_unit is not null loop
- 2
l_obj_name := a_coverage_data.objects(l_unit).name;
- 2
ut_utils.append_to_list(
l_result,
'<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
);
- 2
ut_utils.append_to_list(
l_result,
'<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'
||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
);
- 2
ut_utils.append_to_list(l_result, '<lines>');
- 2
ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
- 2
ut_utils.append_to_list(l_result, c_lines_footer);
- 2
ut_utils.append_to_list(l_result, c_class_footer);
- 2
ut_utils.append_to_list(l_result, c_package_footer);
- 2
l_unit := a_coverage_data.objects.next(l_unit);
end loop;
- 2
ut_utils.append_to_list(l_result, c_packages_footer);
- 2
ut_utils.append_to_list(l_result, c_coverage_footer);
- 2
return l_result;
end;
begin
- 3
ut_coverage.coverage_stop();
- 2
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
- 2
self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
- 2
(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;
UT3.UT_COVERAGE_HTML_REPORTER
88.89 % lines covered
9 relevant lines. 8 lines covered and 1 lines missed
type body ut_coverage_html_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_html_reporter(
self in out nocopy ut_coverage_html_reporter,
a_project_name varchar2 := null,
a_html_report_assets_path varchar2 := null
) return self as result is
begin
- 1
self.init($$plsql_unit);
- 1
self.project_name := a_project_name;
- 1
assets_path := nvl(a_html_report_assets_path, ut_coverage_report_html_helper.get_default_html_assets_path());
- 1
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_coverage_html_reporter, a_run in ut_run) as
- 1
l_coverage_data ut_coverage.t_coverage;
begin
- 2
ut_coverage.coverage_stop();
- 1
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
- 1
self.print_text_lines(
ut_coverage_report_html_helper.get_index(
a_coverage_data => l_coverage_data,
a_assets_path => self.assets_path,
a_project_name => self.project_name,
a_charset => a_run.client_character_set
)
);
end;
overriding member function get_description return varchar2 as
begin
return 'Generates a HTML coverage report with summary and line by line information on code coverage.' || chr(10) ||
'Based on open-source simplecov-html coverage reporter for Ruby.' || chr(10) ||
'Includes source code in the report.';
end;
end;
UT3.UT_COVERAGE_REPORT_HTML_HELPER
94.44 % lines covered
108 relevant lines. 102 lines covered and 6 lines missed
package body ut_coverage_report_html_helper is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
- 1
gc_green_coverage_pct constant integer := 90;
- 1
gc_yellow_coverage_pct constant integer := 80;
- 1
gc_green_css constant varchar2(10) := 'green';
- 1
gc_yellow_css constant varchar2(10) := 'yellow';
- 1
gc_red_css constant varchar2(10) := 'red';
- 1
gc_missed constant varchar2(7) := 'missed';
- 1
gc_skipped constant varchar2(7) := 'skipped';
- 1
gc_disabled constant varchar2(7) := 'never';
- 1
gc_covered constant varchar2(7) := 'covered';
- 1
gc_partcovered constant varchar2(7) := 'partcov';
function get_default_html_assets_path return varchar2 deterministic is
- 1
c_assets_path constant varchar2(200) := 'https://utplsql.github.io/utPLSQL-coverage-html/assets/';
begin
- 1
return c_assets_path;
end;
function coverage_css_class(a_covered_pct number) return varchar2 is
l_result varchar2(10);
begin
- 5
if a_covered_pct > gc_green_coverage_pct then
l_result := gc_green_css;
- 5
elsif a_covered_pct > gc_yellow_coverage_pct then
l_result := gc_yellow_css;
else
- 5
l_result := gc_red_css;
end if;
- 5
return l_result;
end;
function line_status(a_executions in ut_coverage.t_line_executions) return varchar2 is
l_result varchar2(10);
begin
- 16
if a_executions.executions > 0 then
- 3
if NVL(a_executions.partcove,0) = 0 then
- 2
l_result := gc_covered;
else
- 1
l_result := gc_partcovered;
end if;
- 13
elsif a_executions.executions = 0 then
- 1
l_result := gc_missed;
else
- 12
l_result := gc_disabled;
end if;
- 16
return l_result;
end;
function executions_per_line(a_executions number, a_lines integer) return integer is
begin
- 3
return nvl(a_executions / nullif(a_lines, 0), 0);
end;
function line_hits_css_class(a_line_hist number) return varchar2 is
l_result varchar2(10);
begin
- 1
if a_line_hist > 1 then
l_result := gc_green_css;
- 1
elsif a_line_hist = 1 then
- 1
l_result := gc_yellow_css;
else
l_result := gc_red_css;
end if;
- 1
return l_result;
end;
function coverage_pct(a_covered_lines integer, a_uncovered_lines integer) return number is
begin
- 4
return ROUND(nvl(a_covered_lines / nullif(a_covered_lines + a_uncovered_lines, 0), 0) * 100, 2);
end;
function object_id(a_object_full_name varchar2) return varchar2 is
begin
- 3
return rawtohex(utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string => a_object_full_name)));
end;
function link_to_source_file(a_object_full_name varchar2) return varchar2 is
begin
- 1
return '<a href="#' || object_id(a_object_full_name) || '" class="src_link" title="' || a_object_full_name || '">' || a_object_full_name || '</a>';
end;
function get_details_file_content(
a_object_id varchar2,
a_unit ut_object_name,
a_unit_coverage ut_coverage.t_unit_coverage
) return ut_varchar2_rows is
function get_block_file_attributes(a_coverage_unit ut_coverage.t_unit_coverage) return varchar2 is
l_result varchar2(32767);
begin
- 1
if (a_coverage_unit.partcovered_lines is not null) AND (a_coverage_unit.partcovered_lines > 0) then
- 1
l_result := ' (including <span class="yellow"><b>'|| a_coverage_unit.partcovered_lines ||'</b> lines partially covered</span> )';
else
l_result := null;
end if;
- 1
return l_result;
end;
function get_common_file_attributes(a_coverage_unit ut_coverage.t_unit_coverage) return varchar2 is
l_attributes varchar2(32767);
begin
- 1
l_attributes := '<div> <b>' ||(a_coverage_unit.covered_lines + a_coverage_unit.uncovered_lines)
||'</b> relevant lines. ' || '<span class="green"><b>' || a_coverage_unit.covered_lines
||'</b> lines covered</span>'
|| get_block_file_attributes(a_coverage_unit)
|| ' and <span class="red"><b>' || a_coverage_unit.uncovered_lines ||'</b> lines missed</span>';
- 1
return l_attributes;
end;
function build_details_file_content(a_object_id varchar2, a_object_full_name varchar2, a_source_code ut_varchar2_list, a_coverage_unit ut_coverage.t_unit_coverage)
return ut_varchar2_rows is
l_file_part varchar2(32767);
- 1
l_result ut_varchar2_rows := ut_varchar2_rows();
l_coverage_pct number(5, 2);
l_coverage_block_pct number(5, 2);
l_hits varchar2(30);
l_blocks varchar2(30);
begin
- 1
l_coverage_pct := coverage_pct(a_coverage_unit.covered_lines, a_coverage_unit.uncovered_lines);
- 1
l_file_part := '<div class="source_table" id="' || a_object_id || '"><div class="header"> <h3>' ||
dbms_xmlgen.convert(a_object_full_name) || '</h3><h4><span class="' || coverage_css_class(l_coverage_pct) || '">'
|| l_coverage_pct || ' %</span> lines covered</h4>'
||get_common_file_attributes(a_coverage_unit) ||'</div></div><pre><ol>';
- 1
ut_utils.append_to_list(l_result, l_file_part);
- 17
for line_no in 1 .. a_source_code.count loop
- 16
if not a_coverage_unit.lines.exists(line_no) then
- 12
l_file_part := '
<li class="' || line_status(null) || '" data-hits="" data-linenumber="' || line_no || '">
<code class="sql">' || (dbms_xmlgen.convert(a_source_code(line_no))) ||
'</code></li>';
else
- 4
l_hits := to_char(a_coverage_unit.lines(line_no).executions);
- 4
if nvl(a_coverage_unit.lines(line_no).covered_blocks,0) < nvl(a_coverage_unit.lines(line_no).no_blocks,0)
- 1
and nvl(a_coverage_unit.lines(line_no).partcove,0) = 1 then
- 1
l_blocks := to_char(a_coverage_unit.lines(line_no).covered_blocks) || chr(47)||
to_char(a_coverage_unit.lines(line_no).no_blocks);
else
- 3
l_blocks := null;
end if;
- 4
l_file_part := '
<li class="' || line_status(a_coverage_unit.lines(line_no)) || '" data-hits="' ||
dbms_xmlgen.convert(l_hits)|| '"'||
- 1
case
- 1
when l_blocks is not null
then ' data-blocks="'||dbms_xmlgen.convert(l_blocks)||'"'
else
null
end
||' data-linenumber="' || (line_no) || '">';
- 4
if a_coverage_unit.lines(line_no).executions > 0 then
- 3
l_file_part := l_file_part ||
- 1
case when l_blocks is not null
then '
<span class="blocks">' ||dbms_xmlgen.convert(l_blocks) ||
'</span>'
else
null
end
|| '
<span class="hits">' || dbms_xmlgen.convert(l_hits) ||
'</span>';
end if;
- 4
l_file_part := l_file_part || '
<code class="sql">' || (dbms_xmlgen.convert(a_source_code(line_no))) ||
'</code></li>';
end if;
- 16
ut_utils.append_to_list(l_result, l_file_part);
end loop;
- 1
l_file_part := '</ol></pre></div>';
- 1
ut_utils.append_to_list(l_result, l_file_part);
- 1
return l_result;
end;
begin
- 1
return build_details_file_content(
a_object_id,
a_unit.identity,
ut_coverage_helper.get_tmp_table_object_lines(a_unit.owner, a_unit.name),
a_unit_coverage
);
end;
function get_block_list_attributes(a_coverage_unit ut_coverage.t_coverage) return varchar2 is
l_result varchar2(32767);
begin
- 1
if (a_coverage_unit.partcovered_lines is not null) AND (a_coverage_unit.partcovered_lines > 0) then
- 1
l_result := ' (including <span class="yellow"><b>'|| a_coverage_unit.partcovered_lines ||'</b> lines partially covered</span> )';
else
l_result := null;
end if;
- 1
return l_result;
end;
function file_list(a_title varchar2, a_coverage ut_coverage.t_coverage) return ut_varchar2_rows is
l_file_part varchar2(32767);
- 1
l_title varchar2(100) := 'All files';
l_coverage_pct number(5, 2);
l_coverage_block_pct number(5, 2);
l_result ut_varchar2_rows;
- 1
l_id varchar2(50) := object_id(a_title);
- 1
l_unit_coverage ut_coverage.t_unit_coverage;
l_unit ut_coverage.t_object_name;
begin
- 1
l_coverage_pct := coverage_pct(a_coverage.covered_lines, a_coverage.uncovered_lines);
- 1
l_file_part := '<div class="file_list_container" id="' || l_id || '">' || '<h2><span class="group_name">' || l_title ||
'</span>' || ' (<span class="covered_percent"><span class="' || coverage_css_class(l_coverage_pct) || '">' ||
l_coverage_pct || '%</span></span>' || ' lines covered'||
' at <span class="covered_strength">' ||
'<span class="' ||line_hits_css_class(executions_per_line(a_coverage.executions
,a_coverage.uncovered_lines + a_coverage.covered_lines)) || '">' ||
executions_per_line(a_coverage.executions, a_coverage.uncovered_lines + a_coverage.covered_lines)
|| '</span></span> hits/line)</h2>' || '<a id="a_' || l_id || '"></a>' || '<div><b>' ||
a_coverage.objects.count || '</b> files in total. </div><div>' || '<b>' ||
(a_coverage.uncovered_lines + a_coverage.covered_lines)
|| '</b> relevant lines. ' || '<span class="green"><b>' || a_coverage.covered_lines ||
'</b> lines covered</span>'|| get_block_list_attributes(a_coverage)
||' and <span class="red"><b>' || a_coverage.uncovered_lines || '</b> lines missed.</span>'||
'<table class="file_list"><thead>' || '<tr>' ||
'<th>File</th><th>% covered</th><th>Lines</th><th>Relevant Lines</th><th>Lines covered</th><th>Lines missed</th><th>'
||'Avg. Hits / Line </th>' ||
'</tr></thead><tbody>';
- 1
ut_utils.append_to_list( l_result, l_file_part );
- 1
l_unit := a_coverage.objects.first;
- 2
loop
- 2
exit when l_unit is null;
- 1
l_unit_coverage := a_coverage.objects(l_unit);
- 1
l_coverage_pct := coverage_pct(l_unit_coverage.covered_lines, l_unit_coverage.uncovered_lines);
- 1
l_file_part := chr(10) || '<tr>' || '<td class="strong">' || link_to_source_file(dbms_xmlgen.convert(l_unit)) ||
'</td>' || '<td class="' || coverage_css_class(l_coverage_pct) || ' strong">' || l_coverage_pct ||
' %</td>' || '<td>' || l_unit_coverage.total_lines || '</td>' || '<td>' ||
(l_unit_coverage.covered_lines + l_unit_coverage.uncovered_lines) || '</td>' || '<td>' ||
l_unit_coverage.covered_lines || '</td><td>' || l_unit_coverage.uncovered_lines || '</td>' ||
'<td>' || to_char(executions_per_line(l_unit_coverage.executions
,l_unit_coverage.uncovered_lines + l_unit_coverage.covered_lines))
|| '</td></tr>';
- 1
ut_utils.append_to_list( l_result, l_file_part );
- 1
l_unit := a_coverage.objects.next(l_unit);
end loop;
- 1
l_file_part := '</tbody></table></div>';
- 1
ut_utils.append_to_list( l_result, l_file_part );
- 1
return l_result;
end;
/*
* public definitions
*/
function get_index(
a_coverage_data ut_coverage.t_coverage,
a_assets_path varchar2,
a_project_name varchar2 := null,
a_command_line varchar2 := null,
a_charset varchar2 := null
) return ut_varchar2_rows is
l_file_part varchar2(32767);
- 1
l_result ut_varchar2_rows := ut_varchar2_rows();
l_title varchar2(250);
l_coverage_pct number(5, 2);
l_time_str varchar2(50);
l_using varchar2(1000);
l_unit ut_coverage.t_full_name;
l_charset varchar2(1000);
begin
- 1
l_charset := coalesce(upper(a_charset),'UTF-8');
- 1
l_coverage_pct := coverage_pct(a_coverage_data.covered_lines, a_coverage_data.uncovered_lines);
- 1
l_time_str := to_char(sysdate,'yyyy-mm-dd"T"hh24:mi:ss');
- 1
l_using := case
- 1
when a_command_line is not null then
'<br/>using ' || dbms_xmlgen.convert(a_command_line)
end;
- 1
l_title := case
- 1
when a_project_name is null then
'Code coverage'
else
dbms_xmlgen.convert(a_project_name) || ' code coverage'
end;
--TODO - build main file containing total run data and per schema data
- 1
l_file_part := '<!DOCTYPE html><html xmlns=''http://www.w3.org/1999/xhtml''><head>' || '<title>' || l_title ||
'</title>' || '<meta http-equiv="content-type" content="text/html; charset='||l_charset||'" />' ||
'<script src=''' || a_assets_path || 'application.js''></script>' ||
'<link href=''' || a_assets_path ||
'application.css'' media=''screen, print'' rel=''stylesheet'' type=''text/css''/>' ||
'<link rel="shortcut icon" type="image/png" href="' || a_assets_path || 'favicon_' ||
coverage_css_class(l_coverage_pct) || '.png" />' || '<link rel="icon" type="image/png" href="' ||
a_assets_path || 'favicon_' || coverage_css_class(l_coverage_pct) || '.png" />' || '</head>' ||
'<body><div id="loading"><img src="' || a_assets_path || 'loading.gif" alt="loading"/></div>' ||
'<div id="wrapper" style="display:none;">' ||
'<div class="timestamp">Generated <abbr class="timeago" title="' || l_time_str || '">' || l_time_str ||
'</abbr></div>' || '<ul class="group_tabs"></ul>' || '<div id="content">';
- 1
ut_utils.append_to_list(l_result, l_file_part);
- 1
ut_utils.append_to_list(l_result, file_list('All files', a_coverage_data));
- 1
l_file_part := chr(10) || '</div><div id="footer">' ||
'Generated by <a href="http://github.com/utPLSQL/utPLSQL">utPLSQL ' || ut_utils.gc_version ||
'</a><br/>' ||
'Based on <a href="http://github.com/colszowka/simplecov-html">simplecov-html</a> v0.10.0 ' ||
l_using || '' || '</div><div class="source_files">';
- 1
ut_utils.append_to_list(l_result, l_file_part);
- 1
l_unit := a_coverage_data.objects.first;
- 2
loop
- 2
exit when l_unit is null;
- 1
ut_utils.append_to_list(
l_result,
get_details_file_content(
object_id(l_unit),
ut_object_name(a_coverage_data.objects(l_unit).owner,
a_coverage_data.objects(l_unit).name),
a_coverage_data.objects(l_unit)
)
);
- 1
l_unit := a_coverage_data.objects.next(l_unit);
end loop;
- 1
l_file_part := '</div></div></div></body></html>';
- 1
ut_utils.append_to_list(l_result, l_file_part);
- 1
return l_result;
end;
end;
UT3.UT_COVERAGE_SONAR_REPORTER
97.14 % lines covered
35 relevant lines. 34 lines covered and 1 lines missed
type body ut_coverage_sonar_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_sonar_reporter(
self in out nocopy ut_coverage_sonar_reporter
) return self as result is
begin
- 5
self.init($$plsql_unit);
- 5
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_coverage_sonar_reporter, a_run in ut_run) as
function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return ut_varchar2_rows is
l_file_part varchar2(32767);
- 41
l_result ut_varchar2_rows := ut_varchar2_rows();
l_line_no binary_integer;
begin
- 41
l_line_no := a_unit_coverage.lines.first;
- 41
if l_line_no is null then
- 12356
for i in 1 .. a_unit_coverage.total_lines loop
- 12319
ut_utils.append_to_list(l_result, '<lineToCover lineNumber="'||i||'" covered="false"/>');
end loop;
else
- 19
while l_line_no is not null loop
- 15
if a_unit_coverage.lines(l_line_no).executions = 0 then
- 4
l_file_part := '<lineToCover lineNumber="'||l_line_no||'" covered="false"/>';
else
- 11
l_file_part := '<lineToCover lineNumber="'||l_line_no||'" covered="true"';
- 11
if a_unit_coverage.lines(l_line_no).covered_blocks <= a_unit_coverage.lines(l_line_no).no_blocks then
- 6
l_file_part := l_file_part || ' branchesToCover="'||a_unit_coverage.lines(l_line_no).no_blocks||'"';
- 6
l_file_part := l_file_part || ' coveredBranches="'||a_unit_coverage.lines(l_line_no).covered_blocks||'"';
end if;
- 11
l_file_part := l_file_part ||'/>';
end if;
- 15
ut_utils.append_to_list(l_result, l_file_part);
- 15
l_line_no := a_unit_coverage.lines.next(l_line_no);
end loop;
end if;
- 41
return l_result;
end;
function get_coverage_xml(
a_coverage_data ut_coverage.t_coverage,
a_run ut_run
) return ut_varchar2_rows is
- 5
l_result ut_varchar2_rows := ut_varchar2_rows();
l_unit ut_coverage.t_full_name;
- 5
c_coverage_header constant varchar2(30) := '<coverage version="1">';
- 5
c_file_footer constant varchar2(30) := '</file>';
- 5
c_coverage_footer constant varchar2(30) := '</coverage>';
begin
- 5
ut_utils.append_to_list(l_result, ut_utils.get_xml_header(a_run.client_character_set));
- 5
ut_utils.append_to_list(l_result, c_coverage_header);
- 5
l_unit := a_coverage_data.objects.first;
- 46
while l_unit is not null loop
- 42
ut_utils.append_to_list(l_result, '<file path="'||dbms_xmlgen.convert(l_unit)||'">');
- 41
ut_utils.append_to_list(l_result,get_lines_xml(a_coverage_data.objects(l_unit)));
- 41
ut_utils.append_to_list(l_result, c_file_footer);
- 41
l_unit := a_coverage_data.objects.next(l_unit);
end loop;
- 5
ut_utils.append_to_list(l_result, c_coverage_footer);
- 5
return l_result;
end;
begin
- 6
ut_coverage.coverage_stop();
- 5
self.print_text_lines(
get_coverage_xml(
ut_coverage.get_coverage_data(a_run.coverage_options),
a_run
)
);
end;
overriding member function get_description return varchar2 as
begin
return 'Generates a JSON coverage report providing information on code coverage with line numbers.' || chr(10) ||
'Designed for [SonarQube](https://about.sonarqube.com/) to report coverage.' || chr(10) ||
'JSON format returned conforms with the Sonar specification: https://docs.sonarqube.org/display/SONAR/Generic+Test+Data';
end;
end;
UT3.UT_COVERALLS_REPORTER
94.29 % lines covered
35 relevant lines. 33 lines covered and 2 lines missed
type body ut_coveralls_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_coveralls_reporter(
self in out nocopy ut_coveralls_reporter
) return self as result is
begin
- 2
self.init($$plsql_unit);
- 2
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_coveralls_reporter, a_run in ut_run) as
function get_lines_json(a_unit_coverage ut_coverage.t_unit_coverage) return ut_varchar2_rows is
l_file_part varchar2(32767);
- 2
l_result ut_varchar2_rows := ut_varchar2_rows();
l_last_line_no binary_integer;
- 2
c_coverage_header constant varchar2(30) := '"coverage": [';
- 2
c_null constant varchar2(4) := 'null';
begin
- 2
ut_utils.append_to_list(l_result, c_coverage_header);
- 2
l_last_line_no := a_unit_coverage.lines.last;
- 2
if l_last_line_no is null then
- 1
ut_utils.append_to_list(
l_result
, rpad( to_clob( '0' ), ( a_unit_coverage.total_lines * 3 ) - 2, ','||chr(10)||'0' )
);
else
- 8
for line_no in 1 .. l_last_line_no loop
- 7
if a_unit_coverage.lines.exists(line_no) then
- 3
l_file_part := to_char(a_unit_coverage.lines(line_no).executions);
else
- 4
l_file_part := c_null;
end if;
- 7
if line_no < l_last_line_no then
- 6
l_file_part := l_file_part ||',';
end if;
- 7
ut_utils.append_to_list(l_result, l_file_part);
end loop;
end if;
- 2
ut_utils.append_to_list(l_result, ']');
- 2
return l_result;
end;
function get_coverage_json(
a_coverage_data ut_coverage.t_coverage
) return ut_varchar2_rows is
- 2
l_result ut_varchar2_rows := ut_varchar2_rows();
l_unit ut_coverage.t_full_name;
- 2
c_coverage_header constant varchar2(30) := '{"source_files":[';
- 2
c_coverage_footer constant varchar2(30) := ']}'||chr(10)||' ';
begin
- 2
ut_utils.append_to_list(l_result, c_coverage_header);
- 2
l_unit := a_coverage_data.objects.first;
- 4
while l_unit is not null loop
- 2
ut_utils.append_to_list(l_result, '{ "name": "'||l_unit||'",');
- 2
ut_utils.append_to_list(l_result,get_lines_json(a_coverage_data.objects(l_unit)));
- 2
ut_utils.append_to_list(l_result, '}');
- 2
l_unit := a_coverage_data.objects.next(l_unit);
- 2
if l_unit is not null then
ut_utils.append_to_list(l_result, ',');
end if;
end loop;
- 2
ut_utils.append_to_list(l_result, c_coverage_footer);
- 2
return l_result;
end;
begin
- 3
ut_coverage.coverage_stop();
- 2
self.print_text_lines(
get_coverage_json(
ut_coverage.get_coverage_data(a_run.coverage_options)
)
);
end;
overriding member function get_description return varchar2 as
begin
return 'Generates a JSON coverage report providing information on code coverage with line numbers.' || chr(10) ||
'Designed for [Coveralls](https://coveralls.io/).' || chr(10) ||
'JSON format conforms with specification: https://docs.coveralls.io/api-introduction';
end;
end;
UT3.UT_DEBUG_REPORTER
100 % lines covered
25 relevant lines. 25 lines covered and 0 lines missed
type body ut_debug_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_debug_reporter(self in out nocopy ut_debug_reporter) return self as result is
begin
- 1
self.init($$plsql_unit,ut_output_clob_table_buffer());
- 1
self.start_time := current_timestamp();
- 1
self.event_time := current_timestamp();
- 1
return;
end;
overriding member function get_supported_events return ut_varchar2_list is
begin
- 1
return ut_varchar2_list(ut_event_manager.gc_all);
end;
overriding member procedure on_event( self in out nocopy ut_debug_reporter, a_event_name varchar2, a_event_item ut_event_item) is
- 76
c_time constant timestamp := current_timestamp();
- 76
c_time_from_start constant interval day(0) to second(6) := (c_time - self.start_time);
- 76
c_time_from_prev constant interval day(0) to second(6) := (c_time - self.event_time);
- 76
l_stack varchar2(32767) := dbms_utility.format_call_stack();
begin
- 76
l_stack := regexp_replace(
substr( l_stack, instr( l_stack, chr(10), 1, 6 ) +1 ),
'[0-9abcdefx]+ +([0-9]+) +(package |type )?(body )?(.*)','at "\4", line \1');
- 76
if a_event_name = ut_event_manager.gc_initialize then
- 1
self.on_initialize(null);
- 1
self.print_text('<DEBUG_LOG>', ut_event_manager.gc_debug);
end if;
- 76
self.print_text('<DEBUG>', ut_event_manager.gc_debug);
- 76
self.print_text(
' <TIMESTAMP>' || ut_utils.to_string(c_time) || '</TIMESTAMP>' || chr(10)
|| ' <TIME_FROM_START>' || c_time_from_start || '</TIME_FROM_START>' || chr(10)
|| ' <TIME_FROM_PREVIOUS>' || c_time_from_prev || '</TIME_FROM_PREVIOUS>' || chr(10)
|| ' <EVENT_NAME>' || a_event_name || '</EVENT_NAME>',
ut_event_manager.gc_debug
);
- 76
self.print_text( ' <CALL_STACK>' || l_stack || '</CALL_STACK>', ut_event_manager.gc_debug);
- 76
if a_event_item is not null then
- 53
self.print_text_lines(
ut_utils.convert_collection(
ut_utils.clob_to_table( event_item_to_clob(a_event_item), ut_utils.gc_max_storage_varchar2_len )
),
ut_event_manager.gc_debug
);
end if;
- 76
self.print_text('</DEBUG>', ut_event_manager.gc_debug);
- 76
if a_event_name = ut_event_manager.gc_finalize then
- 1
self.print_text('</DEBUG_LOG>', ut_event_manager.gc_debug);
- 1
self.on_finalize(null);
end if;
- 76
self.event_time := current_timestamp();
end;
member function event_item_to_clob(a_event_item ut_event_item) return clob is
l_clob clob;
begin
- 53
select xmlserialize( content deletexml(xmltype(a_event_item),'/*/ITEMS|/*/ALL_EXPECTATIONS|/*/FAILED_EXPECTATIONS') as clob indent size = 2 ) into l_clob from dual;
- 53
return l_clob;
end;
end;
UT3.UT_DOCUMENTATION_REPORTER
98.89 % lines covered
90 relevant lines. 89 lines covered and 1 lines missed
type body ut_documentation_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_documentation_reporter(self in out nocopy ut_documentation_reporter) return self as result is
begin
- 71
self.init($$plsql_unit);
- 71
self.lvl := 0;
- 71
self.failed_test_running_count := 0;
- 71
return;
end;
member function tab(self in ut_documentation_reporter) return varchar2 is
begin
- 1635
return rpad(' ', self.lvl * 2);
end tab;
overriding member procedure print_clob(self in out nocopy ut_documentation_reporter, a_clob clob, a_item_type varchar2 := null) is
l_lines ut_varchar2_list;
- 224
l_out_lines ut_varchar2_rows := ut_varchar2_rows();
begin
- 224
if a_clob is not null and dbms_lob.getlength(a_clob) > 0 then
- 158
l_lines := ut_utils.clob_to_table(a_clob, ut_utils.gc_max_storage_varchar2_len - length(nvl(tab(),0)));
- 614
for i in 1 .. l_lines.count loop
- 456
if l_lines(i) is not null then
- 298
ut_utils.append_to_list(l_out_lines, tab() || l_lines(i) );
end if;
end loop;
- 158
(self as ut_output_reporter_base).print_text_lines(l_out_lines, a_item_type);
end if;
end;
overriding member procedure print_text(self in out nocopy ut_documentation_reporter, a_text varchar2, a_item_type varchar2 := null) is
l_lines ut_varchar2_list;
begin
- 1035
if a_text is not null then
- 1018
l_lines := ut_utils.string_to_table(a_text);
- 2197
for i in 1 .. l_lines.count loop
- 1179
(self as ut_output_reporter_base).print_text(tab || l_lines(i), a_item_type);
end loop;
end if;
end;
overriding member procedure before_calling_suite(self in out nocopy ut_documentation_reporter, a_suite ut_logical_suite) as
begin
- 206
self.print_text(coalesce(a_suite.description, a_suite.name));
- 206
lvl := lvl + 1;
end;
overriding member procedure after_calling_test(self in out nocopy ut_documentation_reporter, a_test ut_test) as
l_message varchar2(4000);
begin
- 216
l_message := coalesce(a_test.description, a_test.name)||' ['||round(a_test.execution_time,3)||' sec]';
--if test failed, then add it to the failures list, print failure with number
- 216
if a_test.result = ut_utils.gc_disabled then
- 1
self.print_yellow_text(l_message || ' (DISABLED)');
- 215
elsif a_test.result = ut_utils.gc_success then
- 158
self.print_green_text(l_message);
- 57
elsif a_test.result > ut_utils.gc_success then
- 57
failed_test_running_count := failed_test_running_count + 1;
- 57
self.print_red_text(l_message || ' (FAILED - ' || failed_test_running_count || ')');
end if;
-- reproduce the output from before/after procedures and the test
- 216
self.print_clob(a_test.get_serveroutputs);
end;
overriding member procedure after_calling_before_all(self in out nocopy ut_documentation_reporter, a_executable in ut_executable) is
begin
- 7
if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then
- 4
self.print_clob(a_executable.serveroutput);
end if;
end;
overriding member procedure after_calling_after_all(self in out nocopy ut_documentation_reporter, a_executable in ut_executable) is
begin
- 5
if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then
- 4
self.print_clob(a_executable.serveroutput);
end if;
end;
overriding member procedure after_calling_suite(self in out nocopy ut_documentation_reporter, a_suite ut_logical_suite) as
begin
- 206
lvl := lvl - 1;
- 206
if lvl = 0 then
- 93
self.print_text(' ');
end if;
end;
overriding member procedure after_calling_run(self in out nocopy ut_documentation_reporter, a_run in ut_run) as
l_summary_text varchar2(4000);
- 70
l_warning_index pls_integer := 0;
-- make all warning indexes uniformly indented
- 70
c_warnings_lpad constant integer := length(to_char(a_run.results_count.warnings_count));
procedure print_failure_for_expectation(a_expectation ut_expectation_result) is
l_lines ut_varchar2_list;
begin
- 10
l_lines := a_expectation.get_result_lines();
- 33
for i in 1 .. l_lines.count loop
- 23
self.print_red_text(l_lines(i));
end loop;
- 10
self.print_cyan_text(a_expectation.caller_info);
- 10
self.print_text(' ');
end;
procedure print_failures_for_test(a_test ut_test, a_failure_no in out nocopy integer) is
begin
- 181
if a_test.result > ut_utils.gc_success then
- 57
a_failure_no := a_failure_no + 1;
- 57
self.print_text(lpad(a_failure_no, length(failed_test_running_count) + 2, ' ') || ') ' ||
nvl(a_test.name, a_test.item.form_name));
- 57
self.lvl := self.lvl + 3;
- 57
self.print_red_text(ut_utils.table_to_clob(a_test.get_error_stack_traces()));
- 67
for j in 1 .. a_test.failed_expectations.count loop
- 10
print_failure_for_expectation(a_test.failed_expectations(j));
end loop;
- 57
self.lvl := self.lvl - 3;
end if;
end;
procedure print_failures_from_suite(a_suite ut_logical_suite, a_failure_no in out nocopy integer) is
begin
- 417
for i in 1 .. a_suite.items.count loop
- 267
if a_suite.items(i) is of(ut_logical_suite) then
- 86
print_failures_from_suite(treat(a_suite.items(i) as ut_logical_suite), a_failure_no);
- 181
elsif a_suite.items(i) is of(ut_test) then
- 181
print_failures_for_test(treat(a_suite.items(i) as ut_test), a_failure_no);
end if;
end loop;
end;
procedure print_failures_details(a_run in ut_run) is
- 70
l_failure_no integer := 0;
begin
- 70
if a_run.results_count.failure_count > 0 or a_run.results_count.errored_count > 0 then
- 46
self.print_text('Failures:');
- 46
self.print_text(' ');
- 110
for i in 1 .. a_run.items.count loop
- 64
print_failures_from_suite(treat(a_run.items(i) as ut_logical_suite), l_failure_no);
end loop;
end if;
end;
procedure print_item_warnings(a_item in ut_suite_item) is
l_items ut_suite_items;
begin
- 29
if a_item is of (ut_logical_suite) then
- 6
l_items := treat(a_item as ut_logical_suite).items;
- 32
for i in 1 .. l_items.count loop
- 26
print_item_warnings(l_items(i));
end loop;
end if;
- 29
if a_item.warnings is not null and a_item.warnings.count > 0 then
- 26
for i in 1 .. a_item.warnings.count loop
- 22
l_warning_index := l_warning_index + 1;
- 22
self.print_text(' ' || lpad(l_warning_index, c_warnings_lpad) || ') ' || a_item.path);
- 22
self.lvl := self.lvl + 3;
- 22
self.print_red_text(a_item.warnings(i));
- 22
self.lvl := self.lvl - 3;
end loop;
- 4
self.print_text(' ');
end if;
end;
procedure print_warnings(a_run in ut_run) is
begin
- 70
if a_run.results_count.warnings_count > 0 then
- 3
self.print_text(' ');
- 3
self.print_text('Warnings:');
- 3
self.print_text(' ');
- 6
for i in 1 .. a_run.items.count loop
- 3
print_item_warnings(treat(a_run.items(i) as ut_suite_item));
end loop;
end if;
end;
begin
- 70
print_failures_details(a_run);
- 70
print_warnings(a_run);
- 70
self.print_text('Finished in ' || a_run.execution_time || ' seconds');
- 70
l_summary_text :=
a_run.results_count.total_count || ' tests, '
|| a_run.results_count.failure_count || ' failed, ' || a_run.results_count.errored_count || ' errored, '
|| a_run.results_count.disabled_count ||' disabled, ' || a_run.results_count.warnings_count || ' warning(s)';
- 70
if a_run.results_count.failure_count + a_run.results_count.errored_count + a_run.results_count.warnings_count > 0 then
- 48
self.print_red_text(l_summary_text);
else
- 22
self.print_green_text(l_summary_text);
end if;
- 70
if a_run.random_test_order_seed is not null then
- 4
self.print_text('Tests were executed with random order seed '''||a_run.random_test_order_seed||'''.');
end if;
- 70
self.print_text(' ');
- 70
(self as ut_reporter_base).after_calling_run(a_run);
end;
overriding member function get_description return varchar2 as
begin
return 'A textual pretty-print of unit test results (usually use for console output)';
end;
end;
UT3.UT_JUNIT_REPORTER
93.85 % lines covered
65 relevant lines. 61 lines covered and 4 lines missed
type body ut_junit_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_junit_reporter(self in out nocopy ut_junit_reporter) return self as result is
begin
- 11
self.init($$plsql_unit);
- 11
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_junit_reporter, a_run in ut_run) is
- 12
l_suite_id integer := 0;
- 12
l_tests_count integer := a_run.results_count.disabled_count + a_run.results_count.success_count +
a_run.results_count.failure_count + a_run.results_count.errored_count;
function get_path(a_path_with_name varchar2, a_name varchar2) return varchar2 is
begin
- 19
return regexp_substr(a_path_with_name, '(.*)\.' ||a_name||'$',subexpression=>1);
end;
procedure print_test_elements(a_test ut_test) is
- 19
l_results ut_varchar2_rows := ut_varchar2_rows();
l_output clob;
begin
- 19
ut_utils.append_to_list(
l_results,
'<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '"' || ' assertions="'
|| nvl(a_test.all_expectations.count,0) || self.get_common_item_attributes(a_test)
- 1
|| case when a_test.result != ut_utils.gc_success then
' status="' || ut_utils.test_result_to_char(a_test.result) || '"' end || '>'
);
- 19
if a_test.result = ut_utils.gc_disabled then
- 2
ut_utils.append_to_list( l_results, '<skipped/>' );
end if;
- 19
if a_test.result = ut_utils.gc_error then
- 2
ut_utils.append_to_list( l_results, '<error>');
- 2
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
- 2
ut_utils.append_to_list( l_results, '</error>');
- 17
elsif a_test.result > ut_utils.gc_success then
- 8
ut_utils.append_to_list( l_results, '<failure>');
- 8
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
- 8
ut_utils.append_to_list( l_results, '</failure>');
end if;
- 19
l_output := a_test.get_serveroutputs();
- 19
if l_output is not null then
- 6
ut_utils.append_to_list( l_results, '<system-out>');
- 6
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_serveroutputs() ) );
- 6
ut_utils.append_to_list( l_results, '</system-out>' );
else
- 13
ut_utils.append_to_list( l_results, '<system-out/>');
end if;
- 19
ut_utils.append_to_list( l_results, '<system-err/>');
- 19
ut_utils.append_to_list( l_results, '</testcase>');
- 19
self.print_text_lines(l_results);
end;
procedure print_suite_elements(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is
- 24
l_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count +
a_suite.results_count.failure_count + a_suite.results_count.errored_count;
l_suite ut_suite;
- 24
l_tests ut_suite_items := ut_suite_items();
- 24
l_results ut_varchar2_rows := ut_varchar2_rows();
l_data clob;
l_errors ut_varchar2_list;
begin
- 24
a_suite_id := a_suite_id + 1;
- 24
self.print_text('<testsuite tests="' || l_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
dbms_xmlgen.convert(a_suite.path) || '" ' || self.get_common_suite_attributes(a_suite) || '>');
-- Becasue testsuites have to appear before test we capture test and leave it for later.
- 55
for i in 1 .. a_suite.items.count loop
- 31
if a_suite.items(i) is of(ut_test) then
- 19
l_tests.extend;
- 19
l_tests(l_tests.last) := treat(a_suite.items(i) as ut_test);
- 12
elsif a_suite.items(i) is of(ut_logical_suite) then
- 12
print_suite_elements(treat(a_suite.items(i) as ut_logical_suite), a_suite_id);
end if;
end loop;
-- Now when all testsuite are printed do the testcases.
- 43
for i in 1 .. l_tests.count loop
- 19
print_test_elements(treat(l_tests(i) as ut_test));
end loop;
- 24
if a_suite is of(ut_suite) then
- 14
l_suite := treat(a_suite as ut_suite);
- 14
l_data := l_suite.get_serveroutputs();
- 14
if l_data is not null then
- 2
ut_utils.append_to_list( l_results, '<system-out>');
- 2
ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_data ) );
- 2
ut_utils.append_to_list( l_results, '</system-out>');
else
- 12
ut_utils.append_to_list( l_results, '<system-out/>');
end if;
- 14
l_errors := l_suite.get_error_stack_traces();
- 14
if l_errors is not empty then
ut_utils.append_to_list( l_results, '<system-err>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
ut_utils.append_to_list( l_results, '</system-err>');
else
- 14
ut_utils.append_to_list( l_results, '<system-err/>');
end if;
end if;
- 24
ut_utils.append_to_list( l_results, '</testsuite>');
- 24
self.print_text_lines(l_results);
end;
begin
- 12
l_suite_id := 0;
- 12
self.print_text(ut_utils.get_xml_header(a_run.client_character_set));
- 12
self.print_text('<testsuites tests="' || l_tests_count || '"' || self.get_common_suite_attributes(a_run) || '>');
- 24
for i in 1 .. a_run.items.count loop
- 12
print_suite_elements(treat(a_run.items(i) as ut_logical_suite), l_suite_id);
end loop;
- 12
self.print_text('</testsuites>');
end;
member function get_common_item_attributes(a_item ut_suite_item) return varchar2 is
begin
- 55
return '" name="' || dbms_xmlgen.convert(nvl(a_item.description, a_item.name))
|| '" time="' || ut_utils.to_xml_number_format(a_item.execution_time()) || '" ';
end;
member function get_common_suite_attributes(a_item ut_suite_item) return varchar2 is
begin
- 36
return ' disabled="' || a_item.results_count.disabled_count
|| '" errors="' || a_item.results_count.errored_count
|| '" failures="' || a_item.results_count.failure_count
|| get_common_item_attributes(a_item);
end;
overriding member function get_description return varchar2 as
begin
return 'Provides outcomes in a format conforming with JUnit 4 and above as defined in: https://gist.github.com/kuzuha/232902acab1344d6b578';
end;
end;
UT3.UT_REALTIME_REPORTER
100 % lines covered
138 relevant lines. 138 lines covered and 0 lines missed
type body ut_realtime_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_realtime_reporter(
self in out nocopy ut_realtime_reporter
) return self as result is
begin
- 2
self.init($$plsql_unit,ut_output_clob_table_buffer());
- 2
total_number_of_tests := 0;
- 2
current_test_number := 0;
- 2
current_indent := 0;
- 2
print_buffer := ut_varchar2_rows();
- 2
return;
end;
overriding member procedure before_calling_run(
self in out nocopy ut_realtime_reporter,
a_run in ut_run
) is
procedure print_test_elements(
a_test in ut_test
) is
begin
- 8
total_number_of_tests := total_number_of_tests + 1;
- 8
self.print_start_node('test', 'id', a_test.path);
- 8
self.print_node('executableType', a_test.item.executable_type);
- 8
self.print_node('ownerName', a_test.item.owner_name);
- 8
self.print_node('objectName', a_test.item.object_name);
- 8
self.print_node('procedureName', a_test.item.procedure_name);
- 8
self.print_node('disabled', case when a_test.get_disabled_flag() then 'true' else 'false' end);
- 8
self.print_node('name', a_test.name);
- 8
self.print_node('description', a_test.description);
- 8
self.print_node('testNumber', to_char(total_number_of_tests));
- 8
self.print_end_node('test');
end print_test_elements;
procedure print_suite_elements(
a_suite in ut_logical_suite
) is
begin
- 6
self.print_start_node('suite', 'id', a_suite.path);
- 6
self.print_node('name', a_suite.name);
- 6
self.print_node('description', a_suite.description);
<<suite_elements>>
- 6
self.print_start_node('items');
- 19
for i in 1 .. a_suite.items.count loop
- 13
if a_suite.items(i) is of(ut_test) then
- 8
print_test_elements(treat(a_suite.items(i) as ut_test));
- 5
elsif a_suite.items(i) is of(ut_logical_suite) then
- 5
print_suite_elements(treat(a_suite.items(i) as ut_logical_suite));
end if;
end loop suite_elements;
- 6
self.print_end_node('items');
- 6
self.print_end_node('suite');
end print_suite_elements;
begin
- 1
xml_header := ut_utils.get_xml_header(a_run.client_character_set);
- 1
self.print_xml_fragment(xml_header);
- 1
self.print_start_node('event', 'type', 'pre-run');
- 1
self.print_start_node('items');
<<items>>
- 2
for i in 1 .. a_run.items.count loop
- 1
print_suite_elements(treat(a_run.items(i) as ut_logical_suite));
end loop items;
- 1
self.print_end_node('items');
- 1
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
- 1
self.print_end_node('event');
- 1
self.flush_print_buffer('pre-run');
end before_calling_run;
overriding member procedure after_calling_run(
self in out nocopy ut_realtime_reporter,
a_run in ut_run
) is
begin
- 1
self.print_xml_fragment(xml_header);
- 1
self.print_start_node('event', 'type', 'post-run');
- 1
self.print_start_node('run');
- 1
self.print_node('startTime', to_char(a_run.start_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 1
self.print_node('endTime', to_char(a_run.end_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 1
self.print_node('executionTime', ut_utils.to_xml_number_format(a_run.execution_time()));
- 1
self.print_start_node('counter');
- 1
self.print_node('disabled', to_char(a_run.results_count.disabled_count));
- 1
self.print_node('success', to_char(a_run.results_count.success_count));
- 1
self.print_node('failure', to_char(a_run.results_count.failure_count));
- 1
self.print_node('error', to_char(a_run.results_count.errored_count));
- 1
self.print_node('warning', to_char(a_run.results_count.warnings_count));
- 1
self.print_end_node('counter');
- 1
self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_run.get_error_stack_traces(), chr(10)||chr(10)));
- 1
self.print_cdata_node('serverOutput', a_run.get_serveroutputs());
- 1
self.print_end_node('run');
- 1
self.print_end_node('event');
- 1
self.flush_print_buffer('post-run');
end after_calling_run;
overriding member procedure before_calling_suite(
self in out nocopy ut_realtime_reporter,
a_suite in ut_logical_suite
) is
begin
- 6
self.print_xml_fragment(xml_header);
- 6
self.print_start_node('event', 'type', 'pre-suite');
- 6
self.print_start_node('suite', 'id', a_suite.path);
- 6
self.print_end_node('suite');
- 6
self.print_end_node('event');
- 6
self.flush_print_buffer('pre-suite');
end before_calling_suite;
overriding member procedure after_calling_suite(
self in out nocopy ut_realtime_reporter,
a_suite in ut_logical_suite
) is
begin
- 6
self.print_xml_fragment(xml_header);
- 6
self.print_start_node('event', 'type', 'post-suite');
- 6
self.print_start_node('suite', 'id', a_suite.path);
- 6
self.print_node('startTime', to_char(a_suite.start_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 6
self.print_node('endTime', to_char(a_suite.end_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 6
self.print_node('executionTime', ut_utils.to_xml_number_format(a_suite.execution_time()));
- 6
self.print_start_node('counter');
- 6
self.print_node('disabled', to_char(a_suite.results_count.disabled_count));
- 6
self.print_node('success', to_char(a_suite.results_count.success_count));
- 6
self.print_node('failure', to_char(a_suite.results_count.failure_count));
- 6
self.print_node('error', to_char(a_suite.results_count.errored_count));
- 6
self.print_node('warning', to_char(a_suite.results_count.warnings_count));
- 6
self.print_end_node('counter');
- 6
self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_suite.get_error_stack_traces(), chr(10)||chr(10)));
- 6
self.print_cdata_node('serverOutput', a_suite.get_serveroutputs());
- 6
self.print_cdata_node('warnings', ut_utils.table_to_clob(a_suite.warnings, chr(10)||chr(10)));
- 6
self.print_end_node('suite');
- 6
self.print_end_node('event');
- 6
self.flush_print_buffer('post-suite');
end after_calling_suite;
overriding member procedure before_calling_test(
self in out nocopy ut_realtime_reporter,
a_test in ut_test
) is
begin
- 8
current_test_number := current_test_number + 1;
- 8
self.print_xml_fragment(xml_header);
- 8
self.print_start_node('event', 'type', 'pre-test');
- 8
self.print_start_node('test', 'id', a_test.path);
- 8
self.print_node('testNumber', to_char(current_test_number));
- 8
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
- 8
self.print_end_node('test');
- 8
self.print_end_node('event');
- 8
self.flush_print_buffer('pre-test');
end before_calling_test;
overriding member procedure after_calling_test(
self in out nocopy ut_realtime_reporter,
a_test in ut_test
) is
begin
- 8
self.print_xml_fragment(xml_header);
- 8
self.print_start_node('event', 'type', 'post-test');
- 8
self.print_start_node('test', 'id', a_test.path);
- 8
self.print_node('testNumber', to_char(current_test_number));
- 8
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
- 8
self.print_node('startTime', to_char(a_test.start_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 8
self.print_node('endTime', to_char(a_test.end_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
- 8
self.print_node('executionTime', ut_utils.to_xml_number_format(a_test.execution_time()));
- 8
self.print_start_node('counter');
- 8
self.print_node('disabled', to_char(a_test.results_count.disabled_count));
- 8
self.print_node('success', to_char(a_test.results_count.success_count));
- 8
self.print_node('failure', to_char(a_test.results_count.failure_count));
- 8
self.print_node('error', to_char(a_test.results_count.errored_count));
- 8
self.print_node('warning', to_char(a_test.results_count.warnings_count));
- 8
self.print_end_node('counter');
- 8
self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_test.get_error_stack_traces(), chr(10)||chr(10)));
- 8
self.print_cdata_node('serverOutput', a_test.get_serveroutputs());
- 8
if a_test.failed_expectations.count > 0 then
- 2
self.print_start_node('failedExpectations');
<<expectations>>
- 5
for i in 1 .. a_test.failed_expectations.count loop
- 3
self.print_start_node('expectation');
- 3
self.print_node('description', a_test.failed_expectations(i).description);
- 3
self.print_cdata_node('message', a_test.failed_expectations(i).message);
- 3
self.print_cdata_node('caller', a_test.failed_expectations(i).caller_info);
- 3
self.print_end_node('expectation');
end loop expectations;
- 2
self.print_end_node('failedExpectations');
end if;
- 8
self.print_cdata_node('warnings', ut_utils.table_to_clob(a_test.warnings, chr(10)||chr(10)));
- 8
self.print_end_node('test');
- 8
self.print_end_node('event');
- 8
self.flush_print_buffer('post-test');
end after_calling_test;
overriding member function get_description return varchar2 is
begin
- 1
return 'Provides test results in a XML format, for clients such as SQL Developer interested in showing progressing details.';
end get_description;
member procedure print_start_node(
self in out nocopy ut_realtime_reporter,
a_node_name in varchar2,
a_attr_name in varchar2 default null,
a_attr_value in varchar2 default null
) is
begin
- 100
self.print_xml_fragment(
'<' || a_node_name
- 1
|| case
- 1
when a_attr_name is not null and a_attr_value is not null then
' ' || a_attr_name || '="' || dbms_xmlgen.convert(a_attr_value) || '"'
end
|| '>',
0, 1
);
end print_start_node;
member procedure print_end_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2
) is
begin
- 100
self.print_xml_fragment('</' || a_name || '>', -1);
end print_end_node;
member procedure print_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2,
a_content in clob
) is
begin
- 232
if a_content is not null then
- 219
self.print_xml_fragment('<' || a_name || '>' || dbms_xmlgen.convert(a_content) || '</' || a_name || '>');
end if;
end print_node;
member procedure print_cdata_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2,
a_content in clob
) is
begin
- 50
if a_content is not null then
- 13
self.print_xml_fragment('<' || a_name || '><![CDATA[' || a_content || ']]></' || a_name || '>');
end if;
end print_cdata_node;
member procedure print_xml_fragment(
self in out nocopy ut_realtime_reporter,
a_fragment in clob,
a_indent_summand_before in integer default 0,
a_indent_summand_after in integer default 0
) is
begin
- 462
current_indent := current_indent + a_indent_summand_before;
- 462
ut_utils.append_to_list(print_buffer, lpad(' ', 2 * current_indent) || a_fragment);
- 462
current_indent := current_indent + a_indent_summand_after;
end print_xml_fragment;
member procedure flush_print_buffer(
self in out nocopy ut_realtime_reporter,
a_item_type in varchar2
) is
l_doc clob;
- 30
l_rows integer := print_buffer.count;
begin
- 513
for i in 1 .. l_rows loop
- 483
ut_utils.append_to_clob(l_doc, print_buffer(i));
- 483
ut_utils.append_to_clob(l_doc, chr(10));
end loop;
- 30
self.print_clob(l_doc, a_item_type);
- 30
print_buffer.delete;
end flush_print_buffer;
end;
UT3.UT_SONAR_TEST_REPORTER
97.73 % lines covered
44 relevant lines. 43 lines covered and 1 lines missed
type body ut_sonar_test_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_sonar_test_reporter(
self in out nocopy ut_sonar_test_reporter
) return self as result is
begin
- 10
self.init($$plsql_unit);
- 10
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_sonar_test_reporter, a_run in ut_run) is
function map_package_to_file(a_suite ut_suite, a_file_mappings ut_file_mappings) return varchar2 is
l_file_name varchar2(4000);
begin
- 20
if a_file_mappings is not null then
- 34
for i in 1 .. a_file_mappings.count loop
- 32
if upper(a_file_mappings(i).object_name) = upper(a_suite.object_name)
- 1
and upper(a_file_mappings(i).object_owner) = upper(a_suite.object_owner)
- 1
and a_file_mappings(i).object_type = 'PACKAGE BODY' then
- 18
l_file_name := a_file_mappings(i).file_name;
- 18
exit;
end if;
end loop;
end if;
- 20
return coalesce(l_file_name, a_suite.path);
end;
procedure print_test_results(a_test ut_test) is
- 43
l_results ut_varchar2_rows := ut_varchar2_rows();
begin
- 43
ut_utils.append_to_list( l_results, '<testCase name="'||dbms_xmlgen.convert(a_test.name)||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
- 43
if a_test.result = ut_utils.gc_disabled then
- 2
ut_utils.append_to_list( l_results, '<skipped message="skipped"/>');
- 41
elsif a_test.result = ut_utils.gc_error then
- 9
ut_utils.append_to_list( l_results, '<error message="encountered errors">');
- 9
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
- 9
ut_utils.append_to_list( l_results, '</error>');
- 32
elsif a_test.result > ut_utils.gc_success then
- 3
ut_utils.append_to_list( l_results, '<failure message="some expectations have failed">');
- 3
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
- 3
ut_utils.append_to_list( l_results, '</failure>');
end if;
- 43
ut_utils.append_to_list( l_results, '</testCase>');
- 43
self.print_text_lines(l_results);
end;
procedure print_suite_results(a_suite ut_logical_suite, a_file_mappings ut_file_mappings) is
begin
- 113
for i in 1 .. a_suite.items.count loop
- 71
if a_suite.items(i) is of(ut_logical_suite) and a_suite.items(i) is not of(ut_suite_context) then
- 26
print_suite_results(treat(a_suite.items(i) as ut_logical_suite), a_file_mappings);
end if;
end loop;
- 42
if a_suite is of(ut_suite) and a_suite is not of(ut_suite_context) then
- 20
self.print_text('<file path="'||dbms_xmlgen.convert(map_package_to_file(treat(a_suite as ut_suite), a_file_mappings))||'">');
end if;
- 113
for i in 1 .. a_suite.items.count loop
- 71
if a_suite.items(i) is of(ut_suite_context) then
- 2
print_suite_results(treat(a_suite.items(i) as ut_suite_context), a_file_mappings);
end if;
end loop;
- 42
if a_suite is of(ut_suite) then
- 73
for i in 1 .. a_suite.items.count loop
- 51
if a_suite.items(i) is of(ut_test) then
- 43
print_test_results(treat(a_suite.items(i) as ut_test));
end if;
end loop;
end if;
- 42
if a_suite is of(ut_suite) and a_suite is not of(ut_suite_context) then
- 20
self.print_text('</file>');
end if;
end;
begin
- 10
self.print_text(ut_utils.get_xml_header(a_run.client_character_set));
- 10
self.print_text('<testExecutions version="1">');
- 24
for i in 1 .. a_run.items.count loop
- 14
print_suite_results(treat(a_run.items(i) as ut_logical_suite), a_run.test_file_mappings);
end loop;
- 10
self.print_text('</testExecutions>');
end;
overriding member function get_description return varchar2 as
begin
return 'Generates a JSON report providing detailed information on test execution.' || chr(10) ||
'Designed for [SonarQube](https://about.sonarqube.com/) to report test execution.' || chr(10) ||
'JSON format returned conforms with the Sonar specification: https://docs.sonarqube.org/display/SONAR/Generic+Test+Data';
end;
end;
UT3.UT_TEAMCITY_REPORTER
94.44 % lines covered
36 relevant lines. 34 lines covered (including 1 lines partially covered ) and 2 lines missed
type body ut_teamcity_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_teamcity_reporter(self in out nocopy ut_teamcity_reporter) return self as result is
begin
- 3
self.init($$plsql_unit);
- 3
return;
end;
overriding member procedure before_calling_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_logical_suite) is
begin
- 8
self.print_text(
ut_teamcity_reporter_helper.test_suite_started(
a_suite_name => nvl(replace(trim(a_suite.description),'.'),a_suite.path)
)
);
end;
overriding member procedure after_calling_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_logical_suite) is
begin
- 8
self.print_text(
ut_teamcity_reporter_helper.test_suite_finished(
a_suite_name => nvl(replace(trim(a_suite.description),'.'),a_suite.path)
)
);
end;
overriding member procedure before_calling_test(self in out nocopy ut_teamcity_reporter, a_test in ut_test) is
l_test_full_name varchar2(4000);
begin
- 6
l_test_full_name := lower(a_test.item.owner_name) || '.' || lower(a_test.item.object_name) || '.' ||
lower(a_test.item.procedure_name);
- 6
self.print_text(
ut_teamcity_reporter_helper.test_started(
a_test_name => l_test_full_name,
a_capture_standard_output => true
)
);
end;
overriding member procedure after_calling_test(self in out nocopy ut_teamcity_reporter, a_test in ut_test) is
- 6
l_results ut_varchar2_rows := ut_varchar2_rows();
l_test_full_name varchar2(4000);
l_std_err_msg varchar2(32767);
function add_error_message( a_message varchar2, a_message_name varchar2) return varchar2 is
begin
- 3
return
- 1
case
- 1
when a_message is not null
then a_message_name || chr(10) || a_message || chr(10)
end;
end;
function add_error_messages(a_executables ut_executables, a_message_name varchar2) return varchar2 is
l_message varchar2(32767);
l_idx binary_integer;
begin
- 4
l_idx := a_executables.first;
- 6
while l_idx is not null loop
- 2
l_message := l_message || add_error_message(a_executables(l_idx).error_backtrace, a_message_name);
- 2
l_idx := a_executables.next(l_idx);
end loop;
- 4
return l_message;
end;
begin
- 6
l_test_full_name := lower(a_test.item.owner_name) || '.' || lower(a_test.item.object_name) || '.' ||
lower(a_test.item.procedure_name);
- 7
if a_test.result = ut_utils.gc_disabled then
- 1
ut_utils.append_to_list( l_results, ut_teamcity_reporter_helper.test_disabled(l_test_full_name));
else
- 5
ut_utils.append_to_list( l_results, a_test.get_serveroutputs());
- 5
if a_test.result = ut_utils.gc_error then
- 1
l_std_err_msg := l_std_err_msg || add_error_messages(a_test.before_each_list, 'Before each exception:');
- 1
l_std_err_msg := l_std_err_msg || add_error_messages(a_test.before_test_list, 'Before test exception:');
- 1
l_std_err_msg := l_std_err_msg || add_error_message(a_test.item.error_backtrace, 'Test exception:');
- 1
l_std_err_msg := l_std_err_msg || add_error_messages(a_test.after_test_list, 'After test exception:');
- 1
l_std_err_msg := l_std_err_msg || add_error_messages(a_test.after_each_list, 'After each exception:');
- 1
ut_utils.append_to_list(
l_results,
ut_teamcity_reporter_helper.test_std_err(
a_test_name => l_test_full_name,
a_out => trim(l_std_err_msg)
)
);
- 1
ut_utils.append_to_list(
l_results,
ut_teamcity_reporter_helper.test_failed(
a_test_name => l_test_full_name,
a_msg => 'Error occured',
a_details =>
trim(l_std_err_msg)
- 2/3 1
|| case when a_test.failed_expectations is not null
- 1
and a_test.failed_expectations.count>0
then a_test.failed_expectations(1).message end
)
);
- 4
elsif a_test.failed_expectations is not null and a_test.failed_expectations.count > 0 then
-- Teamcity supports only a single failure message
- 3
ut_utils.append_to_list(
l_results,
ut_teamcity_reporter_helper.test_failed(
a_test_name => l_test_full_name,
a_msg => a_test.failed_expectations(a_test.failed_expectations.first).description,
a_details => a_test.failed_expectations(a_test.failed_expectations.first).message )
);
- 1
elsif a_test.result = ut_utils.gc_failure then
ut_utils.append_to_list(
l_results,
ut_teamcity_reporter_helper.test_failed(
a_test_name => l_test_full_name,
a_msg => 'Test failed'
)
);
end if;
- 5
ut_utils.append_to_list(
l_results,
ut_teamcity_reporter_helper.test_finished(l_test_full_name, trunc(a_test.execution_time * 1e3))
);
end if;
- 6
self.print_text_lines(l_results);
end;
overriding member function get_description return varchar2 as
begin
return 'Provides the TeamCity (a CI server by jetbrains) reporting-format that allows tracking of progress of a CI step/task as it executes.' || chr(10) ||
'https://confluence.jetbrains.com/display/TCD9/Build+Script+Interaction+with+TeamCity';
end;
end;
UT3.UT_TEAMCITY_REPORTER_HELPER
93.18 % lines covered
44 relevant lines. 41 lines covered and 3 lines missed
package body ut_teamcity_reporter_helper is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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.
*/
subtype t_prop_index is varchar2(2000 char);
type t_props is table of varchar2(32767) index by t_prop_index;
function escape_value(a_value in varchar2) return varchar2 is
begin
- 52
return translate(regexp_replace(a_value, q'/(\'|\||\[|\]|/' || chr(13) || '|' || chr(10) || ')', '|\1'),chr(13)||chr(10),'rn');
end;
function message(a_command in varchar2, a_props t_props default cast(null as t_props)) return varchar2 is
l_message varchar2(32767);
l_index t_prop_index;
l_value varchar2(32767);
- 33
l_max_len binary_integer := 2000;
begin
- 33
l_message := '##teamcity[' || a_command || ' timestamp=''' ||
regexp_replace(to_char(systimestamp, 'YYYY-MM-DD"T"HH24:MI:ss.FF3TZHTZM'), '(\.\d{3})\d+(\+)', '\1\2') || '''';
- 33
l_index := a_props.first;
- 119
while l_index is not null loop
- 86
if a_props(l_index) is not null then
- 51
l_value := escape_value(a_props(l_index));
- 51
if length(l_value) > l_max_len then
- 1
l_value := substr(l_value,1,l_max_len-7)||escape_value('[...]');
end if;
- 51
l_message := l_message || ' ' || l_index || '=''' || l_value || '''';
end if;
- 86
l_index := a_props.next(l_index);
end loop;
- 33
l_message := l_message || ']';
- 33
return l_message;
end message;
function test_suite_started(a_suite_name varchar2, a_flow_id varchar2 default null) return varchar2 is
l_props t_props;
begin
- 8
l_props('name') := a_suite_name;
- 8
l_props('flowId') := a_flow_id;
- 8
return message('testSuiteStarted', l_props);
end;
function test_suite_finished(a_suite_name varchar2, a_flow_id varchar2 default null) return varchar2 is
l_props t_props;
begin
- 8
l_props('name') := a_suite_name;
- 8
l_props('flowId') := a_flow_id;
- 8
return message('testSuiteFinished', l_props);
end;
function test_started(a_test_name varchar2, a_capture_standard_output boolean default null, a_flow_id varchar2 default null) return varchar2 is
l_props t_props;
begin
- 6
l_props('name') := a_test_name;
- 6
l_props('captureStandardOutput') := case a_capture_standard_output
- 1
when true then
'true'
when false then
'false'
else
null
end;
- 6
l_props('flowId') := a_flow_id;
- 6
return message('testStarted', l_props);
end;
function test_finished(a_test_name varchar2, a_test_duration_milisec number default null, a_flow_id varchar2 default null) return varchar2 is
l_props t_props;
begin
- 5
l_props('name') := a_test_name;
- 5
l_props('duration') := a_test_duration_milisec;
- 5
l_props('flowId') := a_flow_id;
- 5
return message('testFinished', l_props);
end;
function test_disabled(a_test_name varchar2, a_flow_id varchar2 default null) return varchar2 is
l_props t_props;
begin
- 1
l_props('name') := a_test_name;
- 1
l_props('flowId') := a_flow_id;
- 1
return message('testIgnored', l_props);
end;
function test_failed(a_test_name varchar2, a_msg in varchar2 default null, a_details varchar2 default null, a_flow_id varchar2 default null, a_actual varchar2 default null, a_expected varchar2 default null) return varchar2 is
l_props t_props;
begin
- 4
l_props('name') := a_test_name;
- 4
l_props('message') := a_msg;
- 4
l_props('details') := a_details;
- 4
l_props('flowId') := a_flow_id;
- 4
if a_actual is not null and a_expected is not null then
l_props('actual') := a_actual;
l_props('expected') := a_expected;
end if;
- 4
return message('testFailed', l_props);
end;
function test_std_err(a_test_name varchar2, a_out in varchar2, a_flow_id in varchar2 default null) return varchar2 is
l_props t_props;
begin
- 1
l_props('name') := a_test_name;
- 1
l_props('out') := a_out;
- 1
l_props('flowId') := a_flow_id;
- 1
return message('testStdErr', l_props);
end;
end ut_teamcity_reporter_helper;
UT3.UT_TFS_JUNIT_REPORTER
92.45 % lines covered
53 relevant lines. 49 lines covered and 4 lines missed
type body ut_tfs_junit_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_tfs_junit_reporter(self in out nocopy ut_tfs_junit_reporter) return self as result is
begin
- 8
self.init($$plsql_unit);
- 8
return;
end;
overriding member procedure after_calling_run(self in out nocopy ut_tfs_junit_reporter, a_run in ut_run) is
begin
- 8
junit_version_one(a_run);
end;
member procedure junit_version_one(self in out nocopy ut_tfs_junit_reporter,a_run in ut_run) is
- 8
l_suite_id integer := 0;
function get_common_suite_attributes(a_item ut_suite_item) return varchar2 is
begin
- 10
return ' errors="' ||a_item.results_count.errored_count || '"' ||
' failures="' || a_item.results_count.failure_count ||
'" name="' || dbms_xmlgen.convert(nvl(a_item.description, a_item.name)) || '"' ||
' time="' || ut_utils.to_xml_number_format(a_item.execution_time()) || '" '||
' timestamp="' || to_char(sysdate,'RRRR-MM-DD"T"HH24:MI:SS') || '" '||
' hostname="' || sys_context('USERENV','HOST') || '" ';
end;
function get_common_testcase_attributes(a_item ut_suite_item) return varchar2 is
begin
- 10
return ' name="' || dbms_xmlgen.convert(nvl(a_item.description, a_item.name)) || '"' ||
' time="' || ut_utils.to_xml_number_format(a_item.execution_time()) || '"';
end;
function get_path(a_path_with_name varchar2, a_name varchar2) return varchar2 is
begin
- 10
return regexp_substr(a_path_with_name, '(.*)\.' ||a_name||'$',subexpression=>1);
end;
procedure print_test_results(a_test ut_test) is
- 10
l_results ut_varchar2_rows := ut_varchar2_rows();
begin
- 10
self.print_text('<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '" ' ||
get_common_testcase_attributes(a_test) || '>');
/*
According to specs :
- A failure is a test which the code has explicitly failed by using the mechanisms for that purpose.
e.g., via an assertEquals
- An errored test is one that had an unanticipated problem.
e.g., an unchecked throwable; or a problem with the implementation of the test.
*/
- 10
if a_test.result = ut_utils.gc_error then
- 1
ut_utils.append_to_list( l_results, '<error type="error" message="Error while executing '||a_test.name||'">');
- 1
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
- 1
ut_utils.append_to_list( l_results, '</error>');
-- Do not count error as failure
- 9
elsif a_test.result = ut_utils.gc_failure then
- 6
ut_utils.append_to_list( l_results, '<failure type="failure" message="Test '||a_test.name||' failed">');
- 6
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
- 6
ut_utils.append_to_list( l_results, '</failure>');
end if;
- 10
ut_utils.append_to_list( l_results, '</testcase>');
- 10
self.print_text_lines(l_results);
end;
procedure print_suite_results(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is
- 17
l_tests_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count +
a_suite.results_count.failure_count + a_suite.results_count.errored_count;
- 17
l_results ut_varchar2_rows := ut_varchar2_rows();
l_suite ut_suite;
l_outputs clob;
l_errors ut_varchar2_list;
begin
- 36
for i in 1 .. a_suite.items.count loop
- 19
if a_suite.items(i) is of(ut_logical_suite) then
- 9
print_suite_results(treat(a_suite.items(i) as ut_logical_suite), a_suite_id);
end if;
end loop;
- 17
if a_suite is of(ut_suite) then
- 10
a_suite_id := a_suite_id + 1;
- 11
self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
dbms_xmlgen.convert(a_suite.path) || '" ' || get_common_suite_attributes(a_suite) || '>');
- 10
self.print_text('<properties/>');
- 22
for i in 1 .. a_suite.items.count loop
- 12
if a_suite.items(i) is of(ut_test) then
- 10
print_test_results(treat(a_suite.items(i) as ut_test));
end if;
end loop;
- 10
l_suite := treat(a_suite as ut_suite);
- 10
l_outputs := l_suite.get_serveroutputs();
- 10
if l_outputs is not null and l_outputs != empty_clob() then
- 1
ut_utils.append_to_list( l_results, '<system-out>');
- 1
ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_suite.get_serveroutputs() ) );
- 1
ut_utils.append_to_list( l_results, '</system-out>');
else
- 9
ut_utils.append_to_list( l_results, '<system-out/>');
end if;
- 10
l_errors := l_suite.get_error_stack_traces();
- 10
if l_errors is not empty then
ut_utils.append_to_list( l_results, '<system-err>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
ut_utils.append_to_list( l_results, '</system-err>');
else
- 10
ut_utils.append_to_list( l_results, '<system-err/>');
end if;
- 10
ut_utils.append_to_list( l_results, '</testsuite>');
- 10
self.print_text_lines(l_results);
end if;
end;
begin
- 8
l_suite_id := 0;
- 8
self.print_text(ut_utils.get_xml_header(a_run.client_character_set));
- 8
self.print_text('<testsuites>');
- 16
for i in 1 .. a_run.items.count loop
- 8
print_suite_results(treat(a_run.items(i) as ut_logical_suite), l_suite_id);
end loop;
- 8
self.print_text('</testsuites>');
end;
overriding member function get_description return varchar2 as
begin
return 'Provides outcomes in a format conforming with JUnit version for TFS / VSTS.
As defined by specs :https://docs.microsoft.com/en-us/vsts/build-release/tasks/test/publish-test-results?view=vsts
Version is based on windy road junit https://github.com/windyroad/JUnit-Schema/blob/master/JUnit.xsd.';
end;
end;
UT3.UT_XUNIT_REPORTER
66.67 % lines covered
3 relevant lines. 2 lines covered and 1 lines missed
type body ut_xunit_reporter is
/*
utPLSQL - Version 3
Copyright 2016 - 2019 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_xunit_reporter(self in out nocopy ut_xunit_reporter) return self as result is
begin
- 1
self.init($$plsql_unit);
- 1
return;
end;
overriding member function get_description return varchar2 as
begin
return 'Depracated reporter. Please use Junit.
Provides outcomes in a format conforming with JUnit 4 and above as defined in: https://gist.github.com/kuzuha/232902acab1344d6b578';
end;
end;